使用第三个参数($ http_response_code)时,header()的第一个参数($ string)无效

时间:2011-10-09 19:12:04

标签: php http httpresponse http-response-codes

简短问题:我可以依赖header('.', TRUE, 404);header('.', TRUE, 501);等行为吗?

现在,让我详细说明。

在提出我的问题之前,我将介绍header()调用的几个用法以及由它生成的相应HTTP响应代码。

header('HTTP/1.1 404 Bummer!'); - HTTP/1.1 404 Bummer!

header('HTTP/1.1 501 I am sick'); - HTTP/1.1 501 I am sick

header('Bummer!', TRUE, 404); - HTTP/1.1 404 Not Found

header('I am sick', TRUE, 501); - HTTP/1.1 501 Method Not Implemented

因此,我们可以看到,如果我们在第一个参数是垃圾时使用第三个参数,则忽略第一个参数。但是,http://php.net/manual/en/function.header.php上的文档说:

  

请注意,此参数仅在字符串不起作用时才有效   空。

所以,我们仍然需要在第一个参数中添加一些内容。这对我来说有点难看,因为当我们在第三个参数中指定$string时会忽略$http_response_code,但我们仍然需要为$string添加一些值,即使它永远不会被使用

但我能理解为什么会这样。传统上,header()仅接受参数,我们可以设置任意响应代码,如前两个示例中所示。第二个和第三个参数后来作为可选参数添加。因此,如果我们想要使用第二个和第三个参数,我们必须为第一个参数指定一些内容。此外,有时我们可能需要在第一个参数中放置有效的标头以及第三个参数中的有效响应代码。我最后已经包含了一个这样的例子。

所以,我打算在我的代码中以这种方式使用此函数:header('.', TRUE, 404);header('.', TRUE, 501);等。根据上面的示例,它会产生正确的HTTP响应。标准。我想知道我是否可以依赖这种行为。我问这个问题是因为我找不到明确提到第一个参数($string)在我们提供第三个参数($http_response_code)时会被忽略的文档。

顺便说一句,我知道第一个参数在这种情况下很有用。

header('Foo: Bar', TRUE, 501);导致:

HTTP/1.1 501 Method Not Implemented
Date: Sun, 09 Oct 2011 19:01:19 GMT
Server: Apache/2.2.20 (Debian)
X-Powered-By: PHP/5.3.8-1
Foo: Bar
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

更实际的例子是header('Location: http://example.com/there/', TRUE, 307);,它会生成:

HTTP/1.1 307 Temporary Redirect
Date: Sun, 09 Oct 2011 19:09:29 GMT
Server: Apache/2.2.20 (Debian)
X-Powered-By: PHP/5.3.8-1
Location: http://example.com/there/
Vary: Accept-Encoding
Content-Type: text/html

无论如何,回到我的问题。我可以依赖header('.', TRUE, 404);header('.', TRUE, 501);等行为吗?

2 个答案:

答案 0 :(得分:3)

不确定您是否正在寻找此项,但我想您不想构建HTTP状态行:

header('.', TRUE, 501);

让我的Apache返回此状态行:

HTTP/1.1 500 Internal Server Error

但是

header(' ', TRUE, 501);

让我的Apache返回此状态行:

HTTP/1.1 501 Not Implemented

这可能是您正在寻找的。

也许您只想构建状态行?

header('HTTP/1.1 501 No Implementation for you :)');

这使我的Apache返回此状态行:

HTTP/1.1 501 No Implementation for you :)

传统上,它是这样做的:

header('HTTP/1.1 501');

然后获得一些默认状态行消息文本:

HTTP/1.1 501 Method Not Implemented

这不会改变协议版本:

header('HTTP/1.0 404');

正如它给出的那样:

HTTP/1.1 404 Not Found

希望这有帮助。


Susam更新:

使用PHP 5.4,一种简单而优雅的方法是:

http_response_code(404);

http_response_code(501);

答案 1 :(得分:1)

目前没有只设置数字HTTP响应代码的功能。但是,我认为PHP 5.4最终会用http_response_code()填充此空白。

我不会自己使用header(".", TRUE, 501)。它可能适用于某些Web服务器软件,但不太可能全部使用它们。