mod_php是否正确地尊重HEAD请求?

时间:2010-04-08 20:11:32

标签: php http mod-php

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源代码并回复我的调查结果。感谢。

2 个答案:

答案 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

所以:服务器没有发送任何输出并不意味着没有做任何事情; - )