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

Перенаправление 301 не выполняется с путем в качестве пункта назначения

Я использую большое количество Redirect 301, которые внезапно перестают работать на новом веб-сервере.

Мы проводим предварительные испытания нового веб-сервера перед переносом сайтов, но некоторые сайты не работают с внутренняя ошибка сервера 500. Контент, как базы данных, так и файлы, зеркально копируются со старого на новый сервер, поэтому мы можем проверить, все ли сайты работают правильно.

Я проследил эту проблему до mod_alias 'Перенаправление выражение, которое используется из .htaccess для перенаправления посетителей и поисковых систем со старого контента на новые страницы.

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

Redirect 301  /directory/  /target/                        # Not Valid
Redirect 301  /main.html   /                               # Not Valid
Redirect 301  /directory/  http://www.example.com/target/  # Valid
Redirect 301  /main.html   http://www.example.com/         # Valid

Это противоречит в Документация Apache для Apache 2.2, в котором говорится:

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

Конечно, я убедился, что мы используем Apache 2.2 как на старом, так и на новом сервере. Старый сервер - это Gentoo с Apache 2.2.11, а новый - это RHEL 5 с Apache 2.2.3.

Обходным путем было бы изменить все пути на полные URL-адреса или преобразовать инструкции в правила mod_rewrite, но я бы предпочел документированное поведение.

Какой у вас опыт?

когда Redirect 301 URL-path URL-path не удается, вы можете попробовать RedirectMatch 301 URL-path URL-path. У меня это сработало на сервере, где Redirect без полного URL-адреса в качестве пункта назначения вызывалось 500 Internal Server error: Redirect to non-URL.

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

Перезапись всех редиректов на похожие RewriteRules помогает, поскольку RewriteRules гораздо более универсальны, но за счет удобочитаемости.

вы должны использовать перенаправление с полным именем нового веб-сервера. поскольку новый веб-сервер находится на новом сервере, apache на вашем старом сервере не может определить, нужно ли использовать только URL-путь. вы должны указать, на какой машине он размещен, если он не тот.

вам следует учесть еще один момент: будет ли ваш старый wevserver отключен когда-нибудь в будущем? Ваш новый сервер примет DNS-имя старого?

возможно, вам стоит подумать о том, чтобы просто изменить DNS после переноса всего сайта на новый сервер.