.htaccess 301 редирект со старого на новый домен, из корня хостинга в подпапку, работает, но почему?

Сценарий: я переместил веб-сайт WordPress в новый домен и хочу перенаправить 301 все страницы из старого домена в новый домен. Оба сайта находятся на одной и той же учетной записи хостинга, на которой работает Apache. Старый сайт находится на корневом уровне (public_html), а новый сайт находится в подпапке (ниже/внутри корня).

Мне удалось заставить эту работу работать, но я хотел бы узнать и понять, почему это работает. Итак, ниже приведен краткий обзор моего «путешествия» и решения, а также три конкретных вопроса.

Сначала я попытался сделать редиректы вот так (код добавлен в корневой файл .htaccess):

# 301 Page Redirects - not working - causes redirect loop

redirect 301 /  https://new-domain.com/     
redirect 301 /services/ https://new-domain.com/services/    
redirect 301 /recipes/  https://new-domain.com/recipes/ 

Но это вызывает цикл перенаправления. Я предполагаю, что файл .htaccess с этими правилами находится на корневом уровне и, следовательно, также влияет на подпапки.

Вопрос 1. Верно ли мое предположение о причине цикла перенаправления?

Затем я попытался быть более конкретным и вместо этого поместил этот код в корневой файл .htaccess:

# 301 Page Redirects - not working - does nothing at all - not sure why 

redirect 301 https://old-domain.com/ https://new-domain.com/    
redirect 301 https://old-domain.com/services/ https://new-domain.com/services/  
redirect 301 https://old-domain.com/recipes/ https://new-domain.com/recipes/

Я надеялся, что приведенный выше код поможет, потому что он более специфичен для старого домена. Я думал, что он точно указывает старый домен и таким образом обходит цикл перенаправления. Но вместо этого этот код, похоже, вообще не действует. Цикл перенаправления исчез, но теперь перенаправления вообще не происходило.

Вопрос 2. Почему приведенный выше код вообще не создает никаких переадресаций?

Затем я нашел этот ответ и применил код из него, который отлично работает и создает все перенаправления. Кроме того, это намного элегантнее, чем мои предыдущие попытки выше. Это код:

# 301 Redirects from old-domain.com to new-domain.com - THIS CODE WORKS - Yay!

RewriteEngine On
RewriteCond %{HTTP_HOST} ^old-domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.old-domain.com$
RewriteRule (.*)$ https://new-domain.com/$1 [R=301,L]

Вопрос 3. Почему этот код не вызывает циклов перенаправления, когда я помещаю его в корневой файл .htaccess?

Я понимаю, что копирую/вставляю код, не полностью понимая, почему он работает. Поэтому я хотел бы объяснить простыми словами об этом поведении. Спасибо.


person Dvaeer    schedule 10.07.2018    source источник
comment
У старого и нового сайта разный контент?   -  person Dusan Bajic    schedule 10.07.2018
comment
Старый и новый сайт являются точными копиями. Так что это фактически смена домена.   -  person Dvaeer    schedule 10.07.2018


Ответы (1)


Ответ 1:

Судя по информации, которую вы предоставили, я бы сказал, что нет. Вы не указали, настроен ли веб-сайт new-domain.com (в конфигурации apache) с его корневым каталогом документа как public_root или public_root/subfolder (судя по описанному поведению, я бы сказал, что это первое). В этом случае, когда вы запрашиваете https://old-domain.com/anything, сервер (из-за безусловного перенаправления в вашем первом правиле) ответит перенаправлением на https://new-domain.com/anything. Затем клиентский браузер запросит этот URL-адрес, и он попадет в тот же Apache и тот же .htaccess, что снова приведет к тому же перенаправлению, что вызовет цикл.

Ответ 2:

Синтаксис перенаправления:

Redirect [status] [URL-path] URL

Старый URL-путь — это путь с учетом регистра (%-decoded), начинающийся с косой черты.

В вашем правиле вы указываете [URL-path] как https://old-domain.com/, что неверно: это может быть /, /services/ или /recipes, но не https://old-domain.com/ или https://old-domain.com/services/. Запрос [URL-path] не соответствует [URL-path] указанному в вашем правиле, поэтому перенаправление не происходит.

Ответ 3:

Это в основном делает то же самое, что и ваше первое правило в ответе 1., с одним важным отличием: сервер ответит перенаправлением, только если имя хоста в запросе (или, если быть более точным, содержимое заголовка Host: в запросе) равно на old-domain.com или www.old-domain.com, что предотвратит зацикливание, поскольку второй запрос от клиента будет использовать имя хоста new-domain.com.

Кроме того, из вышеизложенного кажется, что ваш «новый» веб-сайт в подпапке никогда не будет обслуживаться: если запрашивается old-domain.com или new-domain.com, будет показан сайт из папки public_html (и изменится только имя хоста в адресной строке браузера клиентов).

person Dusan Bajic    schedule 10.07.2018