Назад | Перейти на главную страницу

Как мне 301 перенаправить некоторые определенные URL-адреса, включая корень, в определенные места, а затем все остальное в новый корень?

Я борюсь с проблемой .htaccess mod_rewrite. Помощь приветствуется.

Я хочу, чтобы работали следующие 301 редирект:

  1. mysite.com> https://newsite.com/subdirectory/
  2. mysite.com/old_page_1/> https://newsite.com/subdirectory/new_page_1/
  3. mysite.com/old_page_2/> https://newsite.com/subdirectory/new_page_2/
  4. mysite.com/old_page_3/> https://newsite.com/subdirectory/new_page_3/
  5. mysite.com/anything_else> https://newsite.com/anything_else

Я борюсь с порядком, что ли. Вот мой код:

<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 заголовок, чтобы уловить полное доменное имя, заканчивающееся точкой.

Перед тестированием вам необходимо очистить кеш браузера.