2010-02-05 14 views
11

Usando PHP, ¿cómo puedo probar con precisión que un sitio web remoto admite el encabezado HTTP "If-Modified-Since".Cómo probar la compatibilidad con el encabezado HTTP "If-Modified-Since"

Por lo que he leído, si el archivo remoto que OBTIENE ha sido modificado desde la fecha especificada en la solicitud del encabezado, debería devolver un estado de 200 OK. Si no se ha modificado, debe devolver un 304 No modificado.

Por lo tanto, mi pregunta es, ¿qué pasa si el servidor no admite "If-Modified-Since" pero todavía devuelve un 200 OK?

Existen algunas herramientas que verifican si su sitio web admite "If-Modified-Since", así que supongo que les pregunto cómo funcionan.

Editar:

he realizado algunas pruebas usando Curl, enviando el siguiente;

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()+60*60*60*60))); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_FORBID_REUSE, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); 

i.e. una fecha en el futuro google.com vuelve;

HTTP/1.0 304 Not Modified 
Date: Fri, 05 Feb 2010 16:11:54 GMT 
Server: gws 
X-XSS-Protection: 0 
X-Cache: MISS from . 
Via: 1.0 .:80 (squid) 
Connection: close 

y si envío;

curl_setopt($ch, CURLOPT_HTTPHEADER, array("If-Modified-Since: ".gmdate('D, d M Y H:i:s \G\M\T',time()-60*60*60*60))); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_MAXREDIRS, 5); 
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
curl_setopt($ch, CURLOPT_FORBID_REUSE, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4); 
curl_setopt($ch, CURLOPT_TIMEOUT, 4); 

i.e. una fecha en el pasado, google.com vuelve;

HTTP/1.0 200 OK 
Date: Fri, 05 Feb 2010 16:09:12 GMT 
Expires: -1 
Cache-Control: private, max-age=0 
Content-Type: text/html; charset=ISO-8859-1 
Server: gws 
X-XSS-Protection: 0 
X-Cache: MISS from . 
Via: 1.0 .:80 (squid) 
Connection: close 

Si envio ambos a bbc.co.uk (que no lo admite);

El futuro vuelve;

HTTP/1.1 200 OK 
Date: Fri, 05 Feb 2010 16:12:51 GMT 
Server: Apache 
Set-Cookie: BBC-UID=84bb66bc648318e367bdca3ad1d48cf627005b54f090f211a2182074b4ed92c40ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:12:51 GMT; path=/; domain=bbc.co.uk; 
Accept-Ranges: bytes 
Cache-Control: max-age=0 
Expires: Fri, 05 Feb 2010 16:12:51 GMT 
Pragma: no-cache 
Content-Length: 111677 
Content-Type: text/html 

La fecha en el pasado regresa;

HTTP/1.1 200 OK 
Date: Fri, 05 Feb 2010 16:14:01 GMT 
Server: Apache 
Set-Cookie: BBC-UID=841b66ec44232cd91e81e88a014a3c5e50ed4e20c0e07174c4ff59675cd2fa210ForbSoft%20Web%20Diagnostics%20%28URL%20Validator%29; expires=Tue, 04-Feb-14 16:14:01 GMT; path=/; domain=bbc.co.uk; 
Accept-Ranges: bytes 
Cache-Control: max-age=0 
Expires: Fri, 05 Feb 2010 16:14:01 GMT 
Pragma: no-cache 
Content-Length: 111672 
Content-Type: text/html 

Así que mi pregunta se mantiene.

+0

fija por favor manda el rizo que está usando, estoy probando la línea de comandos y todo lo que estoy haciendo es 200s no importa lo que yo envío cabecera – adamJLev

+0

Si el servidor no admite * If-Modified-Since * pero aún devuelve el código de estado 200, entonces es como si hubiera enviado la solicitud sin * If-Modified-Since * y el servidor responde con el código de estado 200. No hay diferencia. 200 es 200, "La solicitud ha tenido éxito." – Gumbo

+0

@Infinity - He agregado los comandos/opciones de curl en mi publicación original anterior. –

Respuesta

6

He realizado algunas pruebas al respecto y parece funcionar de la siguiente manera;

Si envía un encabezado If-Modified-Since con una fecha que está en el pasado (5 minutos anteriores a la hora actual debería hacerlo), los sitios como google.com, w3.org, mattcutts.com devolver un encabezado "HTTP/1.1 304 no modificado". Los sitios como yahoo.com, bbc.co.uk y stackoverflow.com siempre devuelven un "HTTP/1.1 200 OK".

El "Last-Modified" cabecera tiene nada que ver con "If-Modified-Since" porque el objetivo de repatriar a un "HTTP/1.1 304 Not Modified" de cabecera es que usted no tiene que envíe el cuerpo con él (ahorrando ancho de banda, que es el punto detrás de esto).

Por lo tanto, la respuesta a mi pregunta es que si un sitio no devuelve un encabezado "HTTP/1.1 304 no modificado" cuando envía un encabezado "If-Modified-Since 5 mins ago", el sitio no lo hace t admite la solicitud "If-Modified-Since" correctamente.

Si soy incorrecto, dígalo y proporcione pruebas para mostrar.

Editar: me olvidó añadir que una buena prueba es hacer una petición HEAD normal al dominio (por ejemplo w3.org), agarra la fecha de "última actualización" y luego hacer otra petición con "If-Modified -Ya que:". Esto probará que tanto el valor "Última modificación" como la solicitud "If-Modified-Since" son compatibles. Nota: el hecho de que el servidor envíe una fecha de "Última modificación" no significa que sea compatible con "If-Modified-Since"

+0

Me complace que haya encontrado una solución, pero lo mencioné en mi respuesta como una forma más "práctica" de inferir la capacidad del servidor, en comparación con el enfoque de encabezado más "teórico". Citando a mí mismo: "Tal vez solo puede hacer dos solicitudes, una seguida por otra, enviando un encabezado If-Modified-Since, y luego verificar si la segunda solicitud es un 304 o un 200". – adamJLev

+0

@Infinity - Si lees mi respuesta, verás que la tuya está ladrando en un árbol diferente, pero puedo ver lo que quieres decir con el enfoque "práctico", que es en última instancia donde lo tomé. –

+0

En primer lugar, cada navegador maneja este concepto de manera diferente. En segundo lugar, utilizando Chrome v22, el servidor debe enviar un encabezado "Last-Modified" para que Chrome envíe un encabezado posterior "If-Modified-Since".Esta respuesta no es correcta –

5

Si la entidad devuelve un encabezado "Last-Modified", entonces lo admite. Tiene sentido realmente.

Más información: http://httpd.apache.org/docs/2.2/caching.html (Una Breve Guía de solicitudes condicionales)

Obviamente, es sólo páginas estáticas/archivos tendrá esa cabecera. Con el contenido dinámico (asp, php, etc.) no hay forma de saber por los encabezados (a menos que los manejadores de sitios lo almacenen manualmente, por ejemplo, like this), y la entidad puede o no admitir If-Modified-Since, según mi experiencia.

Tal vez usted puede simplemente hacer dos solicitudes, una seguida de otra, el envío de un If-Modified-Since encabezado y, a continuación, compruebe si la segunda solicitud es un 304 o un 200

EDIT- hurikhan77 señala una Nota importante, y es que, por ejemplo, probar la raíz del sitio para esta capacidad, no garantiza que el resto del sitio sea compatible con esto tampoco.

+0

Sí, tiene sentido y muchas gracias por enviarme ese enlace –

+0

Esto no es exactamente así: reemplace "servidor" por "entidad" y encajará. – hurikhan77

1

con respecto a la primera respuesta anterior Me gustaría señalar que las solicitudes condicionales tienen tanto sentido en contenido dinámico como lo hacen en contenido estático. Si el código que genera el contenido dinámico sabe que la entidad de fondo (por ejemplo, el elemento de la base de datos) no ha cambiado, debe enviar un 304 con una solicitud condicional.

Jan

0

Esta es una excelente herramienta. La misma página ofrece también otras herramientas:

if-modified

Cuestiones relacionadas