Я изучаю PHP на своем компьютере с IIS7.5 в качестве веб-сервера, и у меня проблема с правильной переадресацией 301.
В учебниках и форумах все говорят использовать следующее:
Header('Location: ' . $url, true, 301);
ИЛИ
Header('Location: ' . $url);
В обоих случаях вместо фактического перенаправления браузер (Chrome и Firefox) отображает это:
Object Moved This document may be found here
Используя панель инструментов веб-разработчика FireFox, я получил заголовки страниц, которые были:
Content-Type: text/html; charset=UTF-8 Server: Microsoft-IIS/7.5 X-Powered-By: PHP/5.3.5, ASP.NET Date: Mon, 21 Mar 2011 18:47:35 GMT Content-Length: 123 301 Moved Permanently
Почему страница не перенаправляется? Отображение этой страницы является избыточным и раздражающим для пользователей.
Я понял. Заголовок местоположения должен быть абсолютным путем автоматического перенаправления. Если это относительный путь, он не перенаправляется.
У меня была аналогичная проблема, но путь был уже абсолютным. Я решил это, специально отправив 301 заголовок перед местоположением. PHP должен обнаруживать перенаправления и делать это автоматически, но не выполняет.
header("HTTP/1.1 301 Moved Permanently"); header("location:http://www.mysite.com/mypage.php");
У меня была эта проблема с использованием PHP на IIS7, используя абсолютный URL. Некоторое время я искал меня. Убедитесь, что вы положили exit (); после вашего заголовка ('Местоположение: https: //domain.tld/resource '); заголовок не останавливает выполнение, и функция в противном случае вернется туда, давая неожиданные результаты.
Я придумал легкий взлом, чтобы исправить это. Используйте правило исходящего перенаправления, чтобы установить заголовок Content Length в ответах на перенаправление на 0. Браузеры автоматически обрезают отправленное тело ответа на основе заголовка Content Length.
Вот мое правило перенаправления:
<rewrite> <outboundRules> <rule name="Remove Content from Redirect Requests" preCondition="Is30xStatus" enabled="true" patternSyntax="Wildcard"> <match serverVariable="RESPONSE_CONTENT_LENGTH" pattern="*" /> <action type="Rewrite" value="0" /> </rule> <preConditions> <preCondition name="Is30xStatus"> <add input="{RESPONSE_STATUS}" pattern="^30[1-8]$" /> </preCondition> </preConditions> </outboundRules> </rewrite>
Я бы рекомендовал использовать это как ссылку для создания нового правила исходящего перезаписи с помощью диспетчера IIS, поскольку редактирование файлов web.config напрямую может привести к неожиданным результатам.
Обновление. По-видимому, есть директива PHP, которая также изменяет формат заголовков, чтобы помочь в этом:
cgi.rfc2616_headers = 1
Я тестировал это на своем сервере, и это, похоже, тоже помогает.