Вопрос или проблема
У меня есть поддомен:
https://blog.example.com/
Я принудительно перенаправляю на подкаталог:
https://www.example.com/blog
Поменяв URL сайта и некоторые RewriteRule
в .htaccess
.
Теперь сайт и админка работают хорошо, за исключением маленькой проблемы: когда я пытаюсь нажать кнопку “сохранить” на странице настроек (например: Настройки > Написание), сайт перенаправляется на основной домен:
https://www.example.com/wp-admin/options-writing.php?settings-updated=true
/blog
отсутствует в URL, и в итоге я попадаю на страницу 404 основного сайта.
Мой файл .htaccess выглядит следующим образом:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Host}i ^example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
RewriteCond %{HTTP:X-Forwarded-Server}i !^www\.example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?[0-9]{4}/[0-9]{2}/(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
RewriteCond %{HTTP:X-Forwarded-Server}i !^www\.example\.com
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>
# END WordPress
Когда я нажимаю кнопку “сохранить”, консоль выводит сообщение об ошибке:
/wp-admin/options-general.php?settings-updated=true:1 GET https://www.example.com/wp-admin/options-general.php?settings-updated=true 404 ()
Кто-нибудь может помочь разобраться с этой проблемой?
Обновленный рабочий .htaccess (согласно первому ответу):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /blog/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
</IfModule>
Мой адрес WordPress и адрес сайта:
Адрес WordPress (URL) = /blog
Адрес сайта (URL) = https://www.example.com/blog
По виду вашего .htaccess
, кажется, что в нем слишком много пересекающихся правил. Вместо этого сделайте следующее:
- Сделайте резервную копию вашего текущего
.htaccess
, если вам нужно будет к нему вернуться - Удалите ваш
.htaccess
с сервера, WordPress автоматически создаст для вас новый - Откройте ваш новый файл
.htaccess
и добавьте следующее между тегами<IfModule mod_rewrite.c>
:
.
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
Ваш .htaccess
затем должен выглядеть следующим образом:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# Custom rewrite
RewriteCond %{HTTP_HOST} ^blog\.example\.com$
RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC]
</IfModule>
# END WordPress
Ответ или решение
Проблема, с которой вы столкнулись, связана с перенаправлением сайта на неправильный URL после сохранения настроек на странице администрирования WordPress. Данная проблема может возникать по нескольким причинам, связанным с неправильной конфигурацией файла .htaccess и настройками URL в панели администрирования сайта. Ниже я предоставлю подробное объяснение, примеры, а также способы применения этого решения.
Теория
-
Роль .htaccess:
Файл .htaccess отвечает за управление перенаправлениями и конфигурацию сервера Apache. Этот мощный инструмент может сильно повлиять на работу вашего сайта, особенно когда речь идет о перенаправлениях и обработке URL. -
Общие причины ошибок перенаправления:
- Конфликт между несколькими правилами в .htaccess.
- Неверные настройки адреса сайта или адреса WordPress в админке.
- Использование неправильных условий и правил в областях, учитывающих различные заголовки, такие как X-Forwarded-Host и X-Forwarded-Proto.
-
Настройки URL:
- WordPress разделяет понятия "Адрес WordPress" и "Адрес сайта", что помогает в случаях, когда сайт и файлы WordPress располагаются в разных местах. Неправильная настройка этих параметров может привести к некорректному поведению сайта.
Пример
В вашем случае файл .htaccess представляет собой запутанную последовательность инструкций, в которой, по-видимому, конфликты между различными правилами перенаправлений. Например, вы имеете несколько сегментов, начинающихся с RewriteCond и RewriteRule, которые кажутся дублирующимися. Эти конфликтные правила могут вводить сервер в заблуждение относительно того, какое именно правило использовать в конкретной ситуации.
Применение
-
Резервное копирование текущего .htaccess:
Перед тем как выполнять изменения, обязательно сделайте резервную копию текущего файла .htaccess. Это позволит вам вернуться к исходным настройкам в случае необходимости. -
Упрощение .htaccess:
Удалите текущий файл .htaccess и позвольте WordPress создать новый, минимально необходимый, файл. Затем вручную добавьте только те правила, которые нужны для достижения вашей цели — перенаправления с поддомена на субдиректорию. -
Конфигурация .htaccess:
Ваш новый .htaccess должен выглядеть следующим образом:# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] # Custom rewrite RewriteCond %{HTTP_HOST} ^blog\.example\.com$ RewriteRule ^/?(.*)$ https://www.example.com/blog/$1 [L,R=301,NC] </IfModule> # END WordPress
Особое внимание здесь уделяется тому, чтобы правила касались только тех URL, которые вам действительно необходимо перенаправить.
-
Настройки WordPress:
Проверьте настройки в панели администрирования WordPress:- Адрес WordPress должен быть задан как
/blog
. - Адрес сайта должен быть https://www.example.com/blog.
- Адрес WordPress должен быть задан как
-
Проверка успешности изменений:
Перезагрузите веб-сервер (если это требуется) и протестируйте функционал сохранения настроек. Перенаправление должно быть правильным, направляя вас обратно на https://www.example.com/blog/wp-admin/options-writing.php?settings-updated=true, как ожидалось.
Следуйте этим шагам для упрощения конфигурации вашего .htaccess и проверяйте правильность настроек URL. Это поможет избежать ненужных конфликтов и обеспечит корректную работу вашего сайта.