PHP на IIS7 - получение html-страницы «Перемещение объекта» вместо фактического перенаправления - PullRequest
6 голосов
/ 21 марта 2011

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

Почему страница не перенаправляет?Отображение этой страницы является излишним и раздражающим для пользователей.

Ответы [ 4 ]

3 голосов
/ 19 апреля 2012

У меня была похожая проблема, но путь был уже абсолютным. Я решил это, специально отправив 301 заголовок перед местоположением. PHP должен обнаруживать перенаправления и делать это автоматически, но не делает.

header("HTTP/1.1 301 Moved Permanently");
header("location:http://www.mysite.com/mypage.php");
3 голосов
/ 21 марта 2011

Я понял это. Заголовок Location должен быть абсолютным путем к автоматическому перенаправлению. Если это относительный путь, он не перенаправляет.

2 голосов
/ 31 октября 2014

У меня была эта проблема при использовании PHP на IIS7 с использованием абсолютного URL. Немного подслушал меня. Убедитесь, что вы положили выход(); после вашего заголовок ('Местоположение: https://domain.tld/resource'); заголовок не останавливает выполнение, в противном случае функция вернется куда-нибудь, что может привести к неожиданным результатам.

0 голосов
/ 25 января 2016

Я понял, что это легко исправить.Используйте правило «Исходящее перенаправление», чтобы задать для заголовка «Длина содержимого» в ответах на перенаправление значение 0. Браузеры автоматически усекают отправленное тело ответа на основе заголовка «Длина содержимого».

Вот мое правило перенаправления:

<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

Я проверил это на своем сервере, и это, кажется, также помогает решить проблему.

...