2010-04-08 8 views
5

El HTTP/1.1 RFC estipula que "El método HEAD es idéntico a GET, excepto que el servidor NO DEBE devolver un cuerpo del mensaje en la respuesta". Sé que Apache rinde homenaje al RFC, pero los módulos no tienen por qué hacerlo. Mi pregunta es, ¿mod_php5 lo honra?¿Mod_php respeta las solicitudes HEAD correctamente?

La razón que pido es porque me encontré con un artículo que decía que los desarrolladores de PHP deben comprobar por sí mismos con:

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

Busqué en Google un segundo y no mucho hacia arriba, aparte de algunas personas diciendo que tratan a cosas extrañas como mod_rewrite/redirect después de recibir solicitudes HEAD y algún ticket viejo de errores como 2002, alegando que mod_php todavía ejecutó el resto del script de manera predeterminada. Así que acaba de ejecutar una prueba rápida mediante el uso de los PECL :: HTTP para ejecutar

http_head('http://mysite.com/test-head-request.php'); 

mientras que tener:

<?php error_log('REST OF SCRIPT STILL RAN'); ?> 

en la prueba de la cabeza request.php para ver si el resto del guión todavía ejecutado y no fue así

Me imagino que debería ser suficiente para resolverlo, pero quiero obtener más comentarios y tal vez ayudar a aclarar la confusión para cualquier otra persona que se haya preguntado sobre esto. Entonces, si alguien sabe lo que piensa (sin juego de palabras), o tiene convenciones que usan para recibir solicitudes HEAD, sería genial. De lo contrario, voy a grep la fuente C más tarde y responderé en un comentario con mis hallazgos. Gracias.

Respuesta

3

El método HEAD es idéntico a GET excepto que el servidor NO DEBE devolver un cuerpo del mensaje en la respuesta.

Es por eso que se debe realizar el control no. Los clientes deben tener la confianza de que las solicitudes HEAD procesan de la misma manera que si se emitiera un GET (conexión de base de datos, procesamiento, etc.).

Adición:

Al realizar

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

PHP llenar todavía $ _GET (y $ _REQUEST) con las variables colocados en la cadena de consulta a pesar de que no era una petición GET. Esto permite el cumplimiento de la definición HEAD.

+0

Sí, si coloca el encabezado ('Foo:'. $ _ GET ['encabezado']); error_log ('prueba'); en la parte superior de la secuencia de comandos devuelve ese encabezado/valor y registros. Si coloca ese código en un búfer de salida en el cuerpo HTML, ninguno se ejecutará. Así que PHP parece no solo no devolver el cuerpo del mensaje, ni siquiera lo procesa. Continuaré saliendo; después de todas mis llamadas de encabezado(). Gracias – rkulla

+0

Me alegro de poder ayudar. – webbiedave

+0

@rkulla El código PHP subyacente siempre se ejecuta de la misma manera que una solicitud GET. Tal vez revise sus registros de errores si no es así. – Phil

2

que acabo de hacer una prueba rápida con un archivo PHP, temp.php, que contiene esta porción de código:

<?php 

echo "Hello, World!\n"; 

die; 


envío de una solicitud GET HTTP a ese archivo que me molesta el contenido de la página:

$ 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! 


Si bien enviando una solicitud HTTP HEAD no:

$ 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 


No estoy seguro que siempre es cierto, aunque ...

Recuerdo una situación (hace algún tiempo; fue PHP 5.1) en el cual tuve que probarme a mí mismo, en el código PHP, si recibía una solicitud GET o HEAD.



EDIT: Después de una prueba additionnal

que acabo de hacer otra prueba: mi archivo temp.php ahora contiene esto:

<?php 

file_put_contents('/tmp/a.txt', $_SERVER['REQUEST_METHOD'], FILE_APPEND); 
var_dump($_SERVER['REQUEST_METHOD']); 

die; 

enviando una solicitud HTTP HEAD, Entiendo esto:

$ 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. 

Aquí, no hay salida.

PERO, mirando el archivo /tmp/a.txt:

$ cat /tmp/a.txt 
HEAD 

Por lo tanto: no hay salida enviado por el servidor no quiere decir que no hay nada hecho ;-)

+0

Lo siento, debería haber sido más claro ... Estaba más preocupado con si aún se analizara algún código PHP incrustado en el cuerpo HTML. Ver mi comentario sobre la respuesta de webbiedave. Gracias – rkulla

+0

Puedo confirmar que esto sea correcto con PHP 5.4 y apache. Cuando envía una solicitud de encabezado no ejecuta su código PHP –

+0

@JaseWhatson Creo que quiere decir que, "Cuando envía una solicitud HEAD, INDEED ejecuta su código PHP". Como se explica en esta respuesta, la ejecución del código PHP y la salida de datos de respuesta son dos cosas diferentes. – Phil

Cuestiones relacionadas