PHP中的标头会覆盖HTTP响应代码

时间:2014-08-19 08:51:46

标签: php apache http http-headers

在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

  • HTTP / 1.1 308永久重定向
  • 主持人:localhost:8000
  • 地点:hello.php
  • 连接:关闭
  • X-Powered-By:PHP / 5.5.6

Actual result

  • HTTP / 1.1 302 Found
  • 主持人:localhost:8000
  • 地点:hello.php
  • 连接:关闭
  • X-Powered-By:PHP / 5.5.6

Apache级别的错误或PHP中的错误?

更新:ScreenShot

2 个答案:

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