5

HTTP/1.1 RFC は、「サーバーが応答でメッセージ本文を返してはならないことを除いて、HEAD メソッドは GET と同じです」と規定しています。Apache が RFC を尊重していることは知っていますが、モジュールはそうする必要はありません。私の質問は、mod_php5 はこれを尊重しますか?

私が尋ねる理由は、PHP 開発者がこれを自分で確認する必要があるという記事に出くわしたからです。

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

HEAD リクエストを受け取った後に mod_rewrite/redirect のような奇妙なことを試みていると言う人や、mod_php がデフォルトでスクリプトの残りの部分をまだ実行していると主張する 2002 年のような古いバグ チケットを除いて、私は 1 秒ほどグーグルで検索しましたが、あまり見つかりませんでした。そこで、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 ソースを grep し、調査結果をコメントで返信します。ありがとう。

4

2 に答える 2

3

HEADメソッドはGETと同じですが、サーバーが応答でメッセージ本文を返さないようにする必要があります。

そのため、チェックは実行しないでください。クライアントは、HEAD要求がGETが発行された場合とまったく同じように処理されることを確信している必要があります(データベース接続、処理など)。

補遺:

演奏するとき

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

PHPは、GET要求ではない場合でも、クエリ文字列に配置された変数で$ _GET(および$ _REQUEST)を埋めます。これにより、HEAD定義への準拠が可能になります。

于 2010-04-08T20:35:38.640 に答える
2

temp.phpコードのこの部分を含む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


ただし、これが常に正しいかどうかはわかりません...

GET または HEAD リクエストを受け取った場合、PHP コードで自分自身をテストしなければならなかった状況(少し前; PHP 5.1 でした)を覚えています。



編集:追加のテストの後

私はちょうど別のテストをしました:私の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 に答える