我正在使用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
为什么页面没有重定向?显示该页面对用户来说是多余的和烦人的。
答案 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
我已经在我的服务器上对此进行了测试,这似乎也有助于解决这个问题。