我正在尝试创建一个简单的 Web 服务,该服务必须根据某些条件返回各种 HTTP 代码,主要是与通过 URI 请求的特定资源相关的文件的存在。但是,当我尝试通过 PHP 生成 404 标头时,我遇到了一个非常奇怪的行为。
第一个有效的片段如下:
$isNotFound = TRUE;
if ($isNotFound) header('HTTP/1.1 404 Not Found');
使用简单的命令行 cURL 请求运行此脚本的 URI,我得到:
$ curl -LI http://www.example.com/
HTTP/1.1 404 Not Found
Date: Wed, 18 Sep 2013 20:57.25 GMT
Server: Apache/2.2.22 (Ubuntu)
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Vary: Accept-Encoding
Connection: clse
Content-Type: text/html
现在,第二个镜头是这样的:
$isNotFound = FALSE;
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
$isNotFound = TRUE;
}
if ($isNotFound === TRUE) {
header('HTTP/1.1 404 Not Found');
}
再次运行 cURL,这次我得到了这个:
$ curl -LI http://www.example.com/
HTTP/1.1 200 OK
Date: ...
头部与前者相同,只是代码不同。$isNotFound
为了检查清楚,我还在last 之前打印了 的值if
,它确实被评估为TRUE
,所以header
应该执行带有 404 代码的调用。我还在exit()
最后一个内部添加了一个if
,在脚本末尾添加了另一个header()
,给出了其他代码作为响应(如 302),结果始终是header
内部if
被忽略。
GET
我设法通过在 cURL 调用中明确指定请求方法来使第二个脚本工作:
$ curl -X GET -LI http://www.example.com/
HTTP/1.1 404 Not Found
Date: ...
我也怀疑 cURL 没有GET
用作默认方法,但打印$_SERVER
数组表明请求方法确实是GET
.
那么,这种奇怪行为的原因是什么?使用隐式 GET 方法时 cURL 的错误,还是 PHP 内部发生了什么?或者,也许我太累了,以至于我错过了一些微不足道的事情?
谢谢各位,很抱歉发了这么长的帖子。