Comment faire pour tester le “if-Modified-since” en-Tête HTTP de soutien
À l'aide de PHP comment puis-je tester avec précision que d'un site web distant prend en charge le "if-Modified-since" en-tête HTTP.
De ce que j'ai lu, si le fichier distant, vous OBTENEZ a été modifié depuis la date spécifiée dans l'en-tête de requête - il doit retourner un 200 OK statut. Si il n'a pas été modifié, il doit retourner un "304 not Modified".
Donc ma question est, que faire si le serveur n'est pas support "if-Modified-since", mais renvoie toujours un 200 OK?
Il existe quelques outils qui vérifier si votre site web prend en charge "if-Modified-Since" donc je suppose que je me demande comment ils fonctionnent.
Edit:
J'ai effectué quelques tests à l'aide de Curl, l'envoi de celui-ci;
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);
c'est à dire une date dans le futur google.com retourne;
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
et si j'envoie;
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);
c'est à dire une date dans le passé, google.com retourne;
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 je puis envoyer à la fois à la bbc.co.royaume-uni (qui ne le supporte pas);
L'avenir, on retourne;
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 date dans le passé renvoie;
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
Donc ma question est toujours debout.
Si le serveur ne prend pas en charge if-Modified-since, mais toujours retourne le code d'état 200, alors c'est que vous avez envoyé la demande sans if-Modified-since et le serveur répond avec le code d'état 200. Il n'y a pas de différence. De 200 de 200, “La demande a réussi.”
J'ai ajouté le curl commandes/options dans mon premier post ci-dessus.
La question est mal per se, car l'emplacement/l'entité a à l'appui de cet en-tête, pas le site ou le serveur (comme l'a fait remarquer @l'Infini). Afin de tester une URL unique ne rien vous dire sur le reste de du serveur requestable entités.
OriginalL'auteur J.C | 2010-02-05
Vous devez vous connecter pour publier un commentaire.
J'ai effectué quelques tests sur ce et il semble fonctionner comme suit;
Si vous envoyez un Si-Modified-since-tête avec une date dans le passé (5 minutes précédentes à l'heure actuelle devrait le faire), puis des sites tels que google.com, w3.org, mattcutts.com sera de retour d'une "HTTP/1.1 " 304 not Modified" en-tête. Des Sites tels que yahoo.com, de la bbc.co.royaume-uni et stackoverflow.com toujours le retour d'une "HTTP/1.1 200 OK".
Le "Last-Modified" en-tête a rien à faire avec "if-Modified-Since" parce que le point de renvoyer une "HTTP/1.1 " 304 not Modified" en-tête, c'est que vous n'avez pas à envoyer le corps avec elle (et donc économiser de la bande passante ce qui est, de tout point de retard).
Par conséquent, la réponse à ma question, c'est que si un site ne renvoie pas une "HTTP/1.1 " 304 not Modified" en-tête lorsque vous envoyez un "if-Modified-since 5 minutes il y a" en-tête, le site ne prend pas en charge le "if-Modified-Since" demande correctement.
Si je suis incorrect, veuillez l'indiquer et fournir des tests de montrer.
Edit: j'ai oublié d'ajouter qu'un bon test est de faire une TÊTE normale de demande pour le domaine (par ex. w3.org), prenez la "Dernière mise à jour" et ensuite faire une autre demande avec des "Si-Modified-since:". Ce test que les deux de la "Dernière modification" de la valeur et de "if-Modified-Since" demande sont pris en charge. Veuillez Noter: tout simplement parce que le serveur renvoie une "Dernière mise à jour" ne signifie pas qu'il prend en charge "if-Modified-Since"
Si vous avez lu ma réponse vous verrez qui est le vôtre aboiements d'un autre arbre, mais je vois ce que tu veux dire par l'approche "pratique", qui est en fin de compte où je l'ai pris.
Tout d'abord, chaque navigateur gère ce concept différemment. Deuxièmement, l'utilisation de Chrome v22, le serveur doit envoyer un "Last-Modified" en-tête pour Chrome pour envoyer par la suite une "if-Modified-Since" en-tête. Cette réponse n'est pas correcte.
OriginalL'auteur J.C
Si l'entité retourne un "Last-Modified" en-tête, puis il la prend en charge. Sens vraiment.
Plus d'infos: http://httpd.apache.org/docs/2.2/caching.html (Un Bref Guide pour les Requêtes Conditionnelles)
Évidemment uniquement les pages statiques/fichiers de cet en-tête. Avec des contenus dynamiques (asp, php, etc) il n'y a aucun moyen de savoir par les en-têtes (à moins que le site des gestionnaires de mise en cache manuellement, par exemple comme ceci), et l'entité peuvent ou peuvent ne pas supporter Si-Modified-since, à partir de mon expérience.
Peut-être vous pouvez simplement faire deux demandes, l'un après l'autre, l'envoi d'un Si-Modified-since-tête, puis vérifiez si la deuxième demande est un 304 ou 200.
EDIT - hurikhan77 souligne une note importante, et c'est que, par exemple, les tests de la racine du site pour cette capacité, ne garantit pas que le reste du site ne/ne prend pas en charge cette trop.
Ce n'est pas exactement vrai: Remplacer "serveur" par "entité" et il va s'insérer.
OriginalL'auteur adamJLev
concernant la première réponse ci-dessus, je tiens à noter que les requêtes conditionnelles faire comme beaucoup de sens sur le contenu dynamique comme ils le font sur le contenu statique. Si le code qui génère le contenu dynamique sait que le backend de l'entité (par exemple, élément de base de données) n'a pas changé, il doit envoyer un 304 sur une requête conditionnelle.
Jan
OriginalL'auteur Jan Algermissen