【问题标题】:Invalid first parameter ($string) of header() has no effect while using the third parameter ($http_response_code)header() 的无效第一个参数 ($string) 在使用第三个参数 ($http_response_code) 时无效
【发布时间】:2011-10-09 19:12:03
【问题描述】:

简短的问题:我可以依赖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: @987654322@', 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);等的行为吗?

【问题讨论】:

标签: php http httpresponse http-response-codes


【解决方案1】:

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

header('.', TRUE, 501);

让我的 Apache 返回此状态行:

HTTP/1.1 500 Internal Server Error

但是

header(' ', TRUE, 501);

让我的 Apache 返回此状态行:

HTTP/1.1 501 Not Implemented

这可能是您正在寻找的。​​p>

也许你只是想建立状态栏?

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);

【讨论】:

  • 有趣的回合协议版本和添加的消息。您是否有参考表明这也适用于其他 Web 服务器?
  • header('HTTP/1.1 404')header('HTTP/1.1 501') 等当然看起来很干净。我希望我可以依靠这个。我将使用这个:header("{$_SERVER['SERVER_PROTOCOL']} 501");。这将确保我们在响应中自动使用正确的 HTTP 版本,而无需依赖 Web 服务器来更正它。
  • @NikiC:更改 HTTP 状态行记录在 PHP.net header() 页面上。有两个特殊的标头,一个 HTTP 状态行和一个位置,如果没有指定代码,它会自动设置 301 响应代码。那是在 PHP 方面。使用 F/CGI 接口,服务器如何处理返回的状态行和脚本中的其他标头也是如此。所以它并不总是可预测的,但只要涉及 PHP,如果不确定,只需使用状态行特殊标题。 php.net/header
【解决方案2】:

目前没有仅设置数字 HTTP 响应代码的功能。不过,我认为 PHP 5.4 最终会用http_response_code() 来填补这个空白。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2021-10-30
    • 2017-06-03
    • 2020-03-08
    • 2018-01-15
    • 2017-12-01
    相关资源
    最近更新 更多