Я использую большое количество 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 после переноса всего сайта на новый сервер.