0

我正在尝试创建一个简单的 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 内部发生了什么?或者,也许我太累了,以至于我错过了一些微不足道的事情?

谢谢各位,很抱歉发了这么长的帖子。

4

1 回答 1

1

下次看说明书:

-I, --head
          (HTTP/FTP/FILE) Fetch the HTTP-header only! HTTP-servers feature the 
          command HEAD which this uses to get nothing  but the header of a 
          document. When used on an FTP or FILE file, curl displays the 
          file size and last modification time only.

(或您的网络服务器日志文件,或您的 TCP 流)

于 2013-09-18T22:23:42.997 回答