HTTP / 1.1 RFC规定“HEAD方法与GET相同,但服务器不得在响应中返回消息体。”我知道Apache尊重RFC,但模块不必。我的问题是,mod_php5是否尊重这个?
我问的原因是因为我刚刚看到一篇文章说PHP开发人员应该自己检查:
if (stripos($_SERVER['REQUEST_METHOD'], 'HEAD') !== FALSE) {
exit();
}
我用谷歌搜索了一下并没有多少出现,除了一些人说他们在获得HEAD请求后尝试了一些奇怪的东西,比如mod_rewrite / redirect,以及2002年的一些旧的bug票据声称mod_php仍然执行了脚本的其余部分默认。所以我只是通过使用PECL :: HTTP来运行
进行快速测试 http_head('http://mysite.com/test-head-request.php');
同时:
<?php error_log('REST OF SCRIPT STILL RAN'); ?>
在test-head-request.php中查看脚本的其余部分是否仍然执行,但事实并非如此。
我认为这应该足以解决它,但希望获得更多反馈,并且可能有助于清除那些对此感到疑惑的其他人的困惑。因此,如果有人知道他们的头顶(没有双关语意) - 或者他们用于接收HEAD请求的任何约定,那就太好了。否则,我会稍后查看C源代码并回复我的调查结果。感谢。
答案 0 :(得分:3)
HEAD方法与GET相同 除了服务器不能返回 响应中的消息体。
这就是检查应该不的原因。客户应该确信HEAD请求的处理方式与发布GET的方式相同(数据库连接,处理等)。
<强>附录:强>
执行时
HEAD /test.php?a=3 HTTP/1.1
Host: somesite.com
PHP仍会使用查询字符串中的变量填充$ _GET(和$ _REQUEST),即使它不是GET请求。这允许符合HEAD定义。
答案 1 :(得分:2)
我刚刚使用PHP文件temp.php
进行了快速测试,其中包含以下部分代码:
<?php
echo "Hello, World!\n";
die;
向该文件发送HTTP GET请求会获取该页面的内容:
$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /temp/temp.php HTTP/1.1
Host: localhost
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 20:17:35 GMT
Server: Apache/2.2.12 (Ubuntu)
X-Powered-By: PHP/5.3.2RC2
Vary: Accept-Encoding
Content-Length: 14
Content-Type: text/html
Hello, World!
发送HTTP HEAD请求时不会:
$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD /temp/temp.php HTTP/1.1
Host: localhost
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 20:17:50 GMT
Server: Apache/2.2.12 (Ubuntu)
X-Powered-By: PHP/5.3.2RC2
Vary: Accept-Encoding
Content-Type: text/html
不确定这总是如此......
我记得一个情况(前一段时间;是PHP 5.1)我必须在PHP代码中测试自己,如果我收到GET或HEAD请求。< / p>
编辑:经过额外测试
我刚做了另一个测试:我的temp.php
文件现在包含了这个:
<?php
file_put_contents('/tmp/a.txt', $_SERVER['REQUEST_METHOD'], FILE_APPEND);
var_dump($_SERVER['REQUEST_METHOD']);
die;
发送HTTP HEAD请求,我明白了:
$ telnet localhost 80
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
HEAD /temp/temp.php HTTP/1.1
Host: localhost
HTTP/1.1 200 OK
Date: Thu, 08 Apr 2010 20:21:30 GMT
Server: Apache/2.2.12 (Ubuntu)
X-Powered-By: PHP/5.3.2RC2
Vary: Accept-Encoding
Content-Type: text/html
Connection closed by foreign host.
这里没有输出。
但是,查看/tmp/a.txt文件:
$ cat /tmp/a.txt
HEAD
所以:服务器没有发送任何输出并不意味着没有做任何事情; - )