在POST之后在PHP中设置Location标头时,请避免使用HTTP 302响应代码

Mar*_*elo 2 php post http httpresponse http-headers

我需要201 Created为POST请求放置一个Response代码和一个Location头,但由于某种原因,我仍然得到302响应.

这就是我所拥有的:

header('HTTP/1.1 201');
header("Location: ..."); // The new resource URL
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;
Run Code Online (Sandbox Code Playgroud)

我已经尝试删除内容类型,echo并且exit没有任何运气,仍然得到302.我读到我需要指定两个标题,但这就是我正在做的事,没有运气.我也尝试过:

header("Location: ...", TRUE, 201);
Run Code Online (Sandbox Code Playgroud)

没什么,仍然有302 :(

有人知道我没看到什么吗?

谢谢.

Ale*_*rge 11

更改订单:

header("Location: ..."); // The new resource URL
header('HTTP/1.1 201 Created');
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;
Run Code Online (Sandbox Code Playgroud)

测试:

# curl -i "http://localhost/projects/scratch/302.php"
HTTP/1.1 201 Created
Date: Sun, 29 Jan 2012 23:09:02 GMT
Server: Apache/2.2.17 (Win32) mod_ssl/2.2.17 OpenSSL/0.9.8o PHP/5.3.4 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By: PHP/5.3.5
Location: ...
Content-Length: 0
Content-Type: application/json; charset=utf-8
Run Code Online (Sandbox Code Playgroud)

其他方式

保持原始顺序,但强制201. 根据PHP文档:

它还向浏览器返回REDIRECT(302)状态代码,除非已经设置了201或3xx状态代码.

header('HTTP/1.1 201 Created', true, 201);
header("Location: ..."); // The new resource URL
header('Content-type: application/json; charset=utf-8');
echo $response;
exit;
Run Code Online (Sandbox Code Playgroud)

  • `header('HTTP/1.1 201');`应该是`header('HTTP/1.1 201 Created');` - 响应必须同时具有数字代码和(匹配)文本描述,根据RFC2616:http: //www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1 (4认同)