【问题标题】:PHP on IIS7 - Receiving "Object Moved" html page instead of actually redirectingIIS7 上的 PHP - 接收“对象移动”的 html 页面而不是实际重定向
【发布时间】:2011-03-21 18:53:18
【问题描述】:

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

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

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

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

为什么页面没有重定向?显示该页面对用户来说有点多余和烦人。

【问题讨论】:

    标签: php iis iis-7.5


    【解决方案1】:

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

    【讨论】:

    • 这实际上是您的浏览器而不是 PHP 或您的服务器配置 - 完整 URL 的要求是 HTTP/1.1 的一部分,但有些客户端会遵循 URI。
    • 我在 FireFox 3.6 和 Chrome 10 中观察到了相同的结果。IE9 根本没有做任何事情,它只是显示了一个页面错误。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我在使用绝对 URL 的 IIS7 上使用 PHP 时遇到了这个问题。打扰了我一会儿。确保你把 出口(); 在你之后 header('位置:https://domain.tld/resource'); 标头不会停止执行,否则该函数将返回某个地方,可能会产生意想不到的结果。

      【讨论】:

        【解决方案4】:

        我想出了一个简单的技巧来解决这个问题。使用出站重定向规则将重定向响应中的 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

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

        【讨论】:

        • 好的,我可以看到这会删除整个响应。我在我的 api 的 201 Created 状态上遇到了这个问题,所以我需要我的 api 来返回新对象及其 id。有没有什么好的“hacks”来删除 iis 吐出的愚蠢的 html 标头?
        • 您是否尝试过设置有条件的出站规则?我认为您的评论可能需要一个全新的问题,其中包含回答它所需的所有额外细节和信息。
        • 是的,我就是这么想的。在这里发布:forums.iis.net/p/1234223/…
        猜你喜欢
        • 1970-01-01
        • 2014-10-25
        • 1970-01-01
        • 2013-05-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多