5

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 请求的任何约定,那就太好了。否则,我稍后会 grep C 源代码并在评论中回复我的发现。谢谢。

4

2 回答 2

3

HEAD 方法与 GET 相同,只是服务器不能在响应中返回消息体。

这就是为什么应该执行检查的原因。客户端应该确信 HEAD 请求的处理与发出 GET 一样(数据库连接、处理等)。

附录:

表演时

HEAD /test.php?a=3 HTTP/1.1
Host: somesite.com

即使不是 GET 请求,PHP 仍将使用放置在查询字符串中的变量填充 $_GET(和 $_REQUEST)。这允许符合 HEAD 定义。

于 2010-04-08T20:35:38.640 回答
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 请求。



编辑:经过附加测试

我刚刚做了另一个测试:我的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

所以:服务器没有发送输出并不意味着什么都没做;-)

于 2010-04-08T20:21:15.630 回答