web-dev-qa-db-fra.com

Quelle est la différence entre le code d'état HTTP 200 (cache) et le code d'état 304?

J'utilise le plug-in Google "Page Speed" de Firefox pour accéder à mon site Web.

Certains des composants de ma page sont indiqués en tant que statut HTTP:

200 200 (cache) 304

Par "vitesse de page" de Google.

Ce qui me rend confus, c'est la différence entre 200 (cache) et 304.

J'ai rafraîchi la page plusieurs fois (mais je n'ai pas effacé mon cache) et il semble toujours que mon favicon.ico et quelques images ont le statut status = 200 (cache), tandis que d'autres ont le statut http 304.

Je ne comprends pas pourquoi la différence.

UPDATE:

En utilisant Google "Page Speed", je reçois un "200 (cache)" pour http://example.com/favicon.ico ainsi que http: //cdn.example. com/js/ga.js

Mais je reçois un statut http "304" pour http://cdn.example.com/js/combined.min.js

Je ne comprends pas pourquoi j'ai deux fichiers JavaScript situés dans le même répertoire/js /, l'un renvoyant un état http 304 et l'autre renvoyant un code d'état 200 (cache).

190
Hank

Les éléments portant le code "200 (cache)" ont été remplis directement à partir du cache de votre navigateur, ce qui signifie que les demandes d'origine des éléments ont été renvoyées avec des en-têtes indiquant que le navigateur peut les mettre en cache (par exemple, Expires ou Cache-Control: max-age en-têtes) et qu'au moment où vous avez déclenché la nouvelle demande, ces objets mis en cache étaient toujours stockés dans le cache local et n'avaient pas encore expiré.

304, en revanche, sont la réponse du serveur après que le navigateur a vérifié si un fichier avait été modifié depuis la dernière version mise en cache (la réponse étant "non").

Pour des performances Web optimales, il est préférable de définir un en-tête Expires: ou Cache-Control: max-age futur pour tous les actifs, puis lorsqu'un actif doit être modifié, le changement du nom de fichier de l'actif ou du fichier. ajouter une chaîne de version aux demandes de cet actif. Cela élimine le besoin de faire une demande à moins que l'actif n'ait définitivement changé depuis la version en cache (aucun besoin de cette réponse 304). Yahoo! has plus de consignes de performances liées au cache , notamment pour s'assurer que les balises ETags sont correctement configurées.

214
Ben Regenspan

200 (cache) signifie que Firefox utilise simplement la version mise en cache localement. C'est le plus rapide car aucune demande au serveur Web n'est faite.

304 signifie que Firefox envoie une demande conditionnelle "If-Modified-Since" au serveur Web. Si le fichier n'a pas été mis à jour depuis la date envoyée par le navigateur, le serveur Web renvoie une réponse 304 qui indique essentiellement à Firefox d'utiliser sa version en cache. Ce n'est pas aussi rapide que 200 (cache) car la demande est toujours envoyée au serveur Web, mais le serveur n'a pas à envoyer le contenu du fichier.

Pour répondre à votre dernière question, je ne sais pas pourquoi les deux fichiers JavaScript du même répertoire renvoient des résultats différents.

61
James Lawruk

Cela m'a aussi jeté longtemps. La première chose que je vérifierais, c’est que vous ne rechargez pas la page en cliquant sur le bouton Actualiser, qui émettra toujours une demande conditionnelle de ressources et renverra 304 pour de nombreux éléments de page. Allez plutôt dans la barre d’URL, sélectionnez la page et appuyez sur Entrée comme si vous veniez de taper à nouveau la même URL, cela vous donnera un meilleur indicateur de ce qui est mis en cache correctement. Cet article explique très bien la différence entre les demandes conditionnelles et inconditionnelles et comment le bouton de rafraîchissement les affecte: http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical- informations-sur-conditions-http-conditionnelles-demandes-et-le-bouton-de-rafraîchissement.aspx

18
Pooch

HTTP 304 est "non modifié". En gros, votre serveur Web indique au navigateur "ce fichier n'a pas changé depuis la dernière fois que vous l'avez demandé". Alors qu'un HTTP 200 indique au navigateur "voici une réponse réussie", à renvoyer lorsque c'est la première fois que votre navigateur accède au fichier ou lors du premier accès à une copie modifiée.

Pour plus d’informations sur les codes d’état, consultez la page http://en.wikipedia.org/wiki/List_of_HTTP_status_codes .

8
richleland

304 n'est pas modifié. Je reçois beaucoup ce code dans mes fichiers multimédias comme css et js.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

2
Brandon Henry

Pour ta dernière question, pourquoi? Je vais essayer d'expliquer avec ce que je sais

Une brève explication de ces trois codes de statut en termes simples.

  • 200 - succès (requêtes du navigateur et obtention du fichier du serveur)

Si la mise en cache est activée sur le serveur

  • 200 (à partir de la mémoire cache) - fichier trouvé dans le navigateur. Le navigateur n'entre donc pas dans la requête du serveur.
  • 304 - Le navigateur demande un fichier mais celui-ci est rejeté par le serveur.

Pour certains fichiers, le navigateur décide de demander au serveur et, pour certains, de lire à partir de fichiers stockés (mis en cache). Pourquoi est-ce ? Chaque fichier a une date d'expiration, donc

Si un fichier n'a pas expiré, le navigateur utilisera le cache (200 cache).

Si le fichier a expiré, le navigateur demande au serveur un fichier. Fichier de vérification du serveur aux deux endroits (navigateur et serveur). Si le même fichier est trouvé, le serveur refuse la demande. Selon le protocole, le navigateur utilise le fichier existant.

regardez cette configuration nginx

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

Dans ce cas, l'expiration est définie sur 60 secondes, de sorte que tous les fichiers statiques sont mis en cache pendant 60 secondes. Donc, si vous redemandez un fichier dans les 60 secondes, votre navigateur lira à partir de la mémoire (200 mémoires). Si vous demandez après 60 secondes, le navigateur demandera le serveur (304).

J'ai supposé que le fichier n'était pas modifié après 60 secondes. Dans ce cas, vous obtiendrez 200 (le fichier mis à jour sera récupéré du serveur).

Par conséquent, si les serveurs sont configurés avec des en-têtes (stratégies) d'expiration et de mise en cache différents, l'état peut être différent.

Dans votre cas, vous utilisez cdn, cdn a pour objectif principal une haute disponibilité et une livraison rapide. Par conséquent, ils utilisent plusieurs serveurs. Même s'il semble que les fichiers se trouvent dans le même répertoire, cdn peut utiliser plusieurs serveurs pour fournir du contenu, si ces serveurs ont des configurations différentes. Ensuite, ces statuts peuvent changer. J'espère que ça aide.

1