【问题标题】:Can't set response code to 200 in PHP无法在 PHP 中将响应代码设置为 200
【发布时间】:2011-10-18 12:38:26
【问题描述】:

我正在尝试将 PHP 脚本中的响应代码设置为 200。后来我设置了一个 Location 标头,将其设置为 302。根据文档:

它不仅将此标头发送回浏览器,还 除非 201 或 已经设置了 3xx 状态码。

有没有办法将标头设置为 200 并且不让 location 标头覆盖它?我尝试在 location 标头之后设置响应代码标头,但这不起作用(可能是因为 location 标头已与包含“Found”HTML 位的正文一起发送)。

我可以使用 201 作为响应代码,因为访问脚本的应用程序只检查任何 2xx 代码。但是,根据 HTTP 1.1 规范:

源服务器必须在返回 201 状态码之前创建资源。

但我没有创造任何东西。这是一个问题,还是我可以摆脱它?

【问题讨论】:

  • 如果要重定向,为什么要 200?
  • 这有点令人困惑,但是从两个地方调用相同的脚本,一个需要 200 响应代码,一个需要位置......虽然我可能有一个这些地方发送一些其他参数来确定是否应该发送 Location: 标头。哎呀,回答了我自己的问题。

标签: php http-headers http-status-codes


【解决方案1】:

根据RFC 2616,带有重定向的 200 状态代码无效(请参阅 10.3 重定向 3xx)。重定向时,只有 3xx 码有效。

如果可以完成工作,您可以继续发送任意 2xx 代码,但这会超出标准并且理论上在所有用户代理中都不可靠。

【讨论】:

  • 更不用说搜索引擎可能会将页面标记为无效并停止对其编制索引。
  • 这不是我们担心可搜索的页面。
  • 它在使用 CGI 时有效,因为它指示 Web 服务器进行内部重定向。
【解决方案2】:

嗯,我找到了我的特定问题的答案。我最初的问题是一个地方需要redirect 标头,而另一个地方需要HTTP/1.1 200 OK 标头,因此我可以根据来源使用其中一个。

但是,在尝试了 201 选项之后,它也不起作用,(仍然是 302)所以我不知道这是一个错误还是我做错了什么。

【讨论】:

  • 先生,我已经详细说明了为什么它在我的回答中不起作用:它应该不起作用,因为状态 200 与 location 重定向一起无效。它违反了标准,所以它不起作用是好的:)
  • 但是为什么 201 没有工作,据记录它应该可以正常工作但没有?
  • w3.org/Protocols/rfc2616/rfc2616-sec10.html, 201(正如您在 OP 中讨论的那样)是另一种情况。 php 文档甚至提到了此代码 (php.net/manual/en/function.header.php) - 201 表示您的请求已成功处理,并暗示由于您的请求而创建了一个新的 URI。 URI 可以与状态一起传递,但它不被视为用户代理的“号召性用语”——代理不应该访问给定的 URI。相反,3xx 代码是对用户代理的显式指令。
  • 好吧,我不需要用户代理来实际做任何事情,我只需要使用响应代码 201,但在每种情况下,使用 Location: 标头会导致 302 响应显示向上,即使我在调用 header("Location:...") 之前、之后、甚至在调用期间将其明确设置为 201
  • 你的 PHP 版本是多少?这是过去版本 (4.3.3-RC3) 中的错误,但已得到纠正。我刚刚制作了一个测试文档,如果我这样做,它会完全按预期工作:header('HTTP/1.1 201 Created'); header("Location: http://www.php.net/"); - 我得到一个带有标题201 Created 和location 的http://www.php.net/ 的空白文档
【解决方案3】:

header() 中的“位置:”参数用于重定向。重定向是 HTTP 请求者(即用户代理)使用“位置”中给出的信息向服务器发送新请求的指令。

因此,在任何时候设置状态码为 200 都是错误的,必须忽略;应该默认为 302。

如果您不想重定向,那么就不要设置位置!

【讨论】:

    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2018-05-16
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多