PHP на IIS7 – получение html-страницы «Object Moved» вместо фактического перенаправления

Я изучаю 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

Я тестировал это на своем сервере, и это, похоже, тоже помогает.