Я борюсь с проблемой .htaccess mod_rewrite. Помощь приветствуется.
Я хочу, чтобы работали следующие 301 редирект:
Я борюсь с порядком, что ли. Вот мой код:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/?old_page_1/? https://newsite.com/subdirectory/new_page_1/ [R=301,L]
RewriteRule ^/?old_page_2/? https://newsite.com/subdirectory/new_page_2/ [R=301,L]
RewriteRule ^/?old_page_3/? https://newsite.com/subdirectory/new_page_3/ [R=301,L]
RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L]
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$
RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]
</IfModule>
Первые 4 перезаписи работают, но затем четвертая перезапись нарушает часть ничего_else.
RewriteRule ^/? https://newsite.com/subdirectory/ [R=301,L]
Потому что регулярное выражение ^/?
Спички все. У вас нет привязки к концу строки, поэтому приведенное выше соответствует по желанию /
в начале URL-пути, за которым следует что-нибудь. То же самое относится к предыдущим правилам - хотя это может не быть проблемой.
Обратите внимание, что в .htaccess
, URL-путь, которому соответствует RewriteRule
шаблон никогда не начинается с косой черты, поэтому /?
префикс можно убрать.
Нет необходимости в <IfModule>
оболочку, если вы не собираетесь повторно использовать этот же код на нескольких серверах, когда mod_rewrite может быть недоступен, и вы все равно хотите, чтобы старый сайт работал как есть (вряд ли я так думаю).
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com$ RewriteRule ^(.*)$ https://newsite.com/$1 [R=301,L]
Вы проверяете запрошенный Host
в вашем последнем правиле, но не в предыдущих правилах? Указывают ли старый и новый «домены» на одно и то же место или на разные серверы? Это может не иметь значения, если старые URL-адреса не существуют на новом сайте, хотя вы 301 (постоянно) перенаправляете корень документа?
Обратите внимание: сначала вы должны протестировать 302 (временные) перенаправления и перейти на 301 только тогда, когда уверены, что все работает нормально. 301-е файлы постоянно кэшируются браузером, включая любые ошибочные перенаправления.
Вместо этого попробуйте следующее:
RewriteEngine On
RewriteRule ^old_page_1/?$ https://newsite.com/subdirectory/new_page_1/ [R=302,L]
RewriteRule ^old_page_2/?$ https://newsite.com/subdirectory/new_page_2/ [R=302,L]
RewriteRule ^old_page_3/?$ https://newsite.com/subdirectory/new_page_3/ [R=302,L]
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com
RewriteRule ^$ https://newsite.com/subdirectory/ [R=302,L]
RewriteCond %{HTTP_HOST} ^(www\.)?mysite\.com
RewriteRule (.*) https://newsite.com/$1 [R=302,L]
Обратите внимание, что я удалил конечный $
(привязка конца строки) на CondPattern что сверяется с Host
заголовок, чтобы уловить полное доменное имя, заканчивающееся точкой.
Перед тестированием вам необходимо очистить кеш браузера.