RFC HTTP/1.1 предусматривает, что "ГЛАВНЫЙ метод идентичен для ПОЛУЧЕНИЯ за исключением того, что сервер не ДОЛЖЕН возвращать тело сообщения в ответе". Я знаю, что Apache соблюдает RFC, но модули не имеют к. Мой вопрос, mod_php5 соблюдает это?
Причина, которую я спрашиваю, состоит в том, потому что я просто столкнулся со статьей, говоря, что разработчики PHP должны проверить это сами с:
if (stripos($_SERVER['REQUEST_METHOD'], 'HEAD') !== FALSE) {
exit();
}
Я погуглил секунду и не очень поднятый кроме некоторых людей, говорящих, что они пробуют к странным вещам как mod_rewrite/redirect после получения ГЛАВНЫХ запросов и некоторого старого уведомления об ошибке с подобного 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, чтобы видеть, не сделало ли остальная часть сценария, все еще выполняемого, и это.
Я полагаю, что этого должно быть достаточно, чтобы уладить его, но хотеть получить больше обратной связи и возможно помочь разрешить беспорядок для кого-либо еще, кто задался вопросом об этом. Таким образом, если кто-либо знает от вершины их головы (никакая предназначенная игра слов) - или имейте любые конвенции, которые они используют для получения ГЛАВНЫХ запросов, это было бы большим. Иначе я буду grep источник C позже и отвечать в комментарии моими результатами.Спасибо.
Метод HEAD идентичен GET , за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе.
Поэтому проверка не должна выполняться , а . Клиенты должны быть уверены, что запросы HEAD обрабатываются так же, как если бы был выдан GET (соединение с базой данных, обработка и т. Д.).
Добавление:
При выполнении
HEAD /test.php?a=3 HTTP/1.1
Host: somesite.com
PHP по-прежнему будет заполнять $ _GET (и $ _REQUEST) переменными, помещенными в строку запроса, даже если это не был запрос GET. Это позволяет соответствовать определению HEAD.
Я только что провел быстрый тест с файлом 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
Итак: отсутствие вывода, отправленного сервером, не означает, что ничего не сделано; -)