2010-04-08 83 views
5

HTTP/1.1 RFC规定“HEAD方法与GET相同,只是服务器不能在响应中返回消息体。”我知道Apache尊重RFC,但模块不必。我的问题是,mod_php5是否可以兑现?mod_php是否正确地兑现了HEAD请求?

我想问的原因是因为我刚读到一篇文章来说PHP开发人员应该这与检查自己:

if (stripos($_SERVER['REQUEST_METHOD'], 'HEAD') !== FALSE) { 
     exit(); 
    } 

我GOOGLE了第二并没有太大的止跌回升,比一些人等说,他们尝试对于像mod_rewrite/redirect之类的奇怪事情,在得到HEAD请求之后,以及一些像2002年那样的老bug声称mod_php默认仍然执行脚本的其余部分。所以,我只是用PECL跑了一个快速测试:: HTTP,同时具有运行

http_head('http://mysite.com/test-head-request.php'); 

:在测试头request.php

<?php error_log('REST OF SCRIPT STILL RAN'); ?> 

,看是否脚本的其余部分仍执行,但它没有。

我认为这应该足以解决问题,但希望获得更多的反馈意见,并且可能有助于为其他想知道此问题的人解决困惑。所以如果有人知道他们的头顶(没有双关语意思) - 或者有任何约定用于接收HEAD请求,那就太棒了。否则,我稍后会对C源代码进行评论,并在评论中回应我的发现。谢谢。

回答

3

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

这就是检查应该执行而不是的原因。客户应该确信HEAD请求的处理过程与发出GET(数据库连接,处理等)的过程相同。

附录:

在进行

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

PHP将仍然处于即使它是不是一个GET请求的查询字符串变量填充$ _GET(和$ _REQUEST)。这允许符合HEAD定义。

+0

是的,如果你把头('Foo:'。$ _ GET ['header']); error_log中( '试验');在脚本的顶部它将返回该标题/值和日志。如果您将该代码放入HTML主体的输出缓冲区中,则无法运行。所以PHP似乎不仅不返回消息体,甚至不会处理它。我会继续退出;毕竟我的头()调用。谢谢 – rkulla 2010-04-08 22:27:07

+0

很高兴我能帮到你。 – webbiedave 2010-04-08 22:40:17

+0

@rkulla底层PHP代码总是以与GET请求相同的方式执行。如果不是,请检查您的错误日志。 – Phil 2016-10-04 20:16:01

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 

所以说:没有服务器发送的输出并不意味着有没有这样做;-)

+0

对不起,我应该已经更清楚了......我更关心的是HTML体中的任何嵌入式PHP代码是否仍然会被解析。看到我对webbiedave的回答的评论。谢谢 – rkulla 2010-04-09 05:05:26

+0

我可以证实这与PHP 5.4和apache是​​正确的。当你发送头部请求时,它不会运行你的PHP代码 – 2013-03-08 04:41:02

+0

@JaseWhatson我想你的意思是说:“当你发送HEAD请求时,它会执行INDEED运行你的PHP代码。”正如这个答案所解释的,执行PHP代码和输出响应数据是两件不同的事情。 – Phil 2016-10-04 20:18:53

相关问题