Правильно ли выполняет mod_php HEAD-запросы? - PullRequest
5 голосов
/ 09 апреля 2010

HTTP / 1.1 RFC гласит: «Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе». Я знаю, что Apache соблюдает RFC, но модули не обязаны. У меня вопрос, соблюдает ли mod_php5 это?

Причина, по которой я спрашиваю, заключается в том, что я только что натолкнулся на статью, в которой говорится, что разработчики PHP должны сами проверить это с помощью:

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

Я гуглил секунду, и не очень часто появлялся, за исключением некоторых людей, которые говорят, что пытаются получить странные вещи, такие как mod_rewrite / redirect после получения запросов HEAD, и какой-то старый билет об ошибке, похожий на 2002 год, утверждая, что 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 ]

3 голосов
/ 09 апреля 2010

Метод HEAD идентичен GET за исключением того, что сервер НЕ ДОЛЖЕН возвращаться тело сообщения в ответе.

Поэтому проверка должна , а не . Клиенты должны быть уверены, что запросы HEAD обрабатываются так же, как если бы был выполнен GET (подключение к базе данных, обработка и т. Д.).

Добавление:

При выполнении

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

PHP по-прежнему будет заполнять $ _GET (и $ _REQUEST) переменными, помещенными в строку запроса, даже если это не был запрос GET. Это позволяет соответствовать определению HEAD.

2 голосов
/ 09 апреля 2010

Я только что провел быстрый тест с файлом 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.txtfile:

$ cat /tmp/a.txt 
HEAD

Итак: никакой вывод, отправленный сервером, не означает, что ничего не сделано; -)

...