apache mod_rewrite изменяет базовый URL-адрес в глубоких ссылках

#regex #apache #mod-rewrite #forward

Вопрос:

Весь URL-адрес моей системы меняется, поскольку он перемещается в другое место. Я хотел бы использовать свой старый Apache для переадресации 301 всех вызовов на новую систему в течение некоторого времени.

У меня есть такие глубокие ссылки:

 https://old.example/groups/something
 

который останется неизменным в новой системе, но с другим базовым URL-адресом, например:

 https://new.example/groups/something
 

Я ищу правило перезаписи Apache, которое поддерживает все после old.example/ изменения части базового url и отправки пользователя в местоположение deeplink, которое он запрашивал в новой системе.

Я пытался:

 RewriteCond %{HTTP_HOST} old.example$
RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* https://new.example/ [R=301,L]
 

но это работает только в том случае, если базовый URL вызывается напрямую, а не для глубоких ссылок.

Комментарии:

1. Используете ли вы .htaccess ?

Ответ №1:

 RewriteCond %{HTTP_HOST} old.example$
RewriteCond %{REQUEST_URI} ^/$
RewriteRule .* https://new.example/ [R=301,L]
 

Ваше второе условие ( RewriteCond директива) специально проверяет, что REQUEST_URI это только корень документа («базовый URL»). Вы также не передаете запрошенный URL-путь к целевому URL.

Однако, если новый сайт переместился в «другое местоположение», а новые и старые домены указывают на разные серверы, вы можете использовать простую Redirect директиву на вашем «старом сервере Apache», чтобы перенаправить все и сохранить ту же структуру URL. Например:

 Redirect 301 / https://my.new.system.url.net/
 

Redirect Директива соответствует префиксу, и все, что после совпадения, копируется в конец целевого URL. Итак, запрос на /groups/something перенаправляется на https://my.new.system.url.net/groups/something .

Протестируйте с 302 (временным) перенаправлением, чтобы избежать потенциальных проблем с кэшированием.

Ссылка:


В сторону: просто краткое замечание об «уникальной» терминологии, которую вы использовали для описания URL, поскольку это немного сбивает с толку…

То, что вы называете «базовым URL», на самом деле является именем хоста (или доменным именем).

И то, что вы называете «глубокой ссылкой», на самом деле является URL-путем (или оставшейся частью URL). URL-путь начинается с первой косой черты после имени хоста.