我正在尝试创建一个简单的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
之前打印了if
的值,并且它确实已评估为TRUE
,因此header
调用了404代码应该执行。我还在最后exit()
内添加了if
,在脚本末尾添加了另一个header()
,并在响应中提供了其他代码(如302),结果始终是{ <{1}}内的{1}}会被忽略。
我设法通过在cURL调用中将请求方法明确指定为header
来使第二个脚本工作:
if
我还怀疑cURL没有使用GET
作为默认方法,但是打印$ curl -X GET -LI http://www.example.com/
HTTP/1.1 404 Not Found
Date: ...
数组显示请求方法确实是GET
。
那么,这种奇怪行为的原因是什么?使用隐式GET方法时cURL是否有错误,或者PHP内部发生了什么?或者也许我太累了,我错过了一些微不足道的东西?
谢谢你们,对不起,我很抱歉。
答案 0 :(得分: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流)