2010-04-08 53 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

相關問題