IIS7上的PHP - 接收“Object Moved”html页面而不是实际重定向

时间:2011-03-21 18:53:19

标签: php iis iis-7.5

我正在使用IIS7.5作为Web服务器在我的计算机上学习PHP,并且在完成301重定向时遇到问题。

教程和论坛都说要使用以下内容:

Header('Location: ' . $url, true, 301);

OR

Header('Location: ' . $url);

在这两种情况下,浏览器(Chrome和Firefox)都显示以下内容,而不是实际重定向:

Object Moved

This document may be found here

使用FireFox Web开发人员工具栏,我检索了页眉,其中包括:

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 个答案:

答案 0 :(得分:3)

我明白了。 Location标头必须是自动重定向的绝对路径。如果它是相对路径,则不会重定向。

答案 1 :(得分:3)

我有一个类似的问题,但路径已经是绝对的。我通过在该位置之前专门发送301标头来解决它。 PHP应该检测重定向并自动执行此操作但不执行此操作。

header("HTTP/1.1 301 Moved Permanently");
header("location:http://www.mysite.com/mypage.php");

答案 2 :(得分:2)

我在使用绝对URL的IIS7上使用PHP时出现此问题。让我感到有些不安。确保你放     出口(); 在你之后     标题('Location:https://domain.tld/resource'); 标题不会停止执行,否则该函数将返回某处,从而产生意外结果。

答案 3 :(得分:0)

我想出了一个简单的黑客来解决这个问题。使用“出站重定向”规则将重定向响应中的“内容长度”标题设置为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

我已经在我的服务器上对此进行了测试,这似乎也有助于解决这个问题。