mod_php соблюдает ГЛАВНЫЕ запросы правильно?

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 позже и отвечать в комментарии моими результатами.Спасибо.

5
задан rkulla 9 April 2010 в 04:31
поделиться

2 ответа

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

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

Добавление:

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

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

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

3
ответ дан 14 December 2019 в 19:08
поделиться

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

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

2
ответ дан 14 December 2019 в 19:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: