在Apache级别处理设置规则,发现php中的标题(' Location:filename.php')会覆盖响应代码。请看下面的代码: -
<?php
header('HTTP/1.1 308 Permanent Redirect'); //or Try for 4xx/5xx Code
header('Location: http://hello.php');
?>
Expected result
Actual result
302 Found
Apache级别的错误或PHP中的错误?
更新:
答案 0 :(得分:2)
根据the function documentation page,这是发送Location标头时PHP的理想行为。
编辑:抱歉,误读了你的消息。如果您发送的代码不同于3xx,它将覆盖响应代码,因此它应该与308一起使用。 您确定没有其他HTTP代码被发回吗?您的客户端是否尝试检索新资源,您是否将302视为最终结果?最终编辑:你有没有尝试
header('Location: /some/page.php', TRUE, 308);
答案 1 :(得分:1)
如PHP documentation of header()中所述,&#34;位置&#34;有特殊情况。标题类型。它设置302响应代码,除非已设置201或3xx状态代码。不幸的是,它不会像您在示例中看到的那样起作用。
我已经使用过代码,当你改变这样的操作顺序时它看起来很有用:
<?php
header('Location: landing.php');
header('HTTP/1.1 308 Permanent Redirect');
?>
似乎标题(&#39;位置... )在任何情况下都会覆盖响应代码,但会执行标题(&#39; HTTP / 1.1 308 ...... 强>之后将其改回308。
做了一些额外的调查,结果就是这里。
header('Location: http://smth');
除了308之外,不会更改3 **的响应代码。所以如果你这样做
<?php
header('HTTP/1.1 307 Temporary Redirect');
header('Location: landing.php');
?>
上面的代码将按预期正常工作。 所以你很幸运#39;在规则中查找异常。虽然我的解决方法允许解决问题。 PS:使用PHP 5.4.27