无效的第一个参数($string)在使用第三个参数($http_response_code)时不起作用


Invalid first parameter ($string) of header() has no effect while using the third parameter ($http_response_code)

简短的问题:我可以依赖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上的文档说:

注意,这个参数只有在字符串不存在时才有效空的。

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

但是我能理解为什么事情会变成这样。传统上,header()只接受参数,我们可以像前两个例子一样设置任意的响应码。第二个和第三个参数稍后作为可选参数添加。因此,如果我们想要使用第二个和第三个参数,我们必须为第一个参数指定一些东西。此外,有时我们可能需要在第一个参数中放入有效的标头,并在第三个参数中放入有效的响应代码。我在最后包含了一个这样的例子。

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

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

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);等的行为吗?

不确定您是否正在寻找这个,但我猜您不想构建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

希望对你有帮助。


Update by Susam:

对于PHP 5.4,一个简单而优雅的方法是:

http_response_code(404);

http_response_code(501);

目前没有只设置数字HTTP响应代码的函数。然而,我认为PHP 5.4最终会用http_response_code()来填补这个空白。

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