web-dev-qa-db-fra.com

Les réponses 304 Non modifiées doivent-elles inclure l'en-tête "Dernière modification"?

J'utilise l'outil le plus excellent http://redbot.org pour les tests. Les en-têtes HTTP de mon site sont corrects (son code personnalisé dans PHP servant du contenu dynamique - si vous le souhaitez. s'assurer qu'il est mis en cache si possible - servi par Apache2)

Un des tests dit:

The If-Modified-Since response is missing required headers

HTTP requires 304 Not Modified responses to have certain headers, if they are also present in a normal (e.g., 200 OK response).
This response is missing the following headers: last-modified.
This can affect cache operation; because the headers are missing, caches might remove them from their cached copies.

... ainsi, resonse n'inclut pas l'en-tête Last-Modified. Cependant, le code essaie de l'envoyer. En recherchant plus loin, il semble qu'Apache utilise une liste blanche d'en-têtes HTTP, cela permettra à 304 réponses ...

if (r->status == HTTP_NOT_MODIFIED) {
    apr_table_do((int (*)(void *, const char *, const char *)) form_header_field,
                 (void *) &h, r->headers_out,
                 "Connection",
                 "Keep-Alive",
                 "ETag",
                 "Content-Location",
                 "Expires",
                 "Cache-Control",
                 "Vary",
                 "Warning",
                 "WWW-Authenticate",
                 "Proxy-Authenticate",
                 "Set-Cookie",
                 "Set-Cookie2",
                 NULL);
}
else {
    send_all_header_fields(&h, r);
}

Cela se trouve autour de la ligne 1281 dans modules/http/http_filters.c du code source Apache HTTPD 2.2.22.

.... "Dernière modification" ne figure pas sur cette liste.

La question est donc de savoir ce qui ne va pas, Redbot ou Apache?

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ne semble pas spécifier si la dernière modification doit être incluse. (il est dit que l'Etag devrait être - et cela est autorisé dans la liste des Apaches)

En cas d’utilité, c’est le cas de test: http://redbot.org/?uri=http%3A%2F%2Fwww.geograph.org.uk%2Fhelp%2Fsitemap - mon code incluez l'en-tête Last-Modified - c'est juste que redbot ne l'obtient jamais (ni aucun en-tête X- .. personnalisé).

5
barryhunter

Vous avez raison. RED a mis en œuvre les exigences de HTTPbis http://tools.ietf.org/html/draft-ietf-httpbis-p4-conditional-18#section-4.1 .

Normalement, les exigences HTTPbis sont rétro-compatibles avec la RFC2616 (c’est-à-dire qu’elles ne font pas actuellement d’implémentations conformes à la non-conformité 2616), mais cette modification a échoué. Nous allons ouvrir un problème pour résoudre ce problème. En attendant, je changerai les exigences des RED.

5
Mark Nottingham

Non, Last-Modified n'est pas obligatoire, comme vous l'avez indiqué dans la RFC 2616. J'ai trouvé ce problème https://github.com/mnot/redbot/issues/61 dans lequel ils ont implémenté le chèque pour les en-têtes requis. Cependant, ils ont déclaré dans le numéro que seule la "date" était requise, mais que la mise en œuvre était différente (par erreur, je pense).

3
jcisio