简短的问题:我可以依赖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_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服务器软件,但不太可能适用于所有服务器。