web-dev-qa-db-fra.com

Est-il faisable d'utiliser Vary: en-têtes avec If-no-match: pour améliorer la mise en cache?

Comme nous le savons tous, l'envoi d'un en-tête de réponse Vary: Some-Header fait que les caches stockent (ou devraient causer) différentes variantes de la réponse, une pour chaque valeur de Some-Header: qu'il rencontre dans les requêtes. Cependant, cette méthode présente des inconvénients avec les en-têtes qui présentent des variations énormes, tels que User-Agent: ou Accept-Language:.

Supposons que notre serveur souhaite varier en fonction d'un en-tête très variable, mais ne contient en réalité qu'une poignée de variantes. Je pense que la suite presque fonctionne:

  • Le serveur utilise tous les en-têtes de requête pour déterminer quelle variante servir. supposons qu'il décide d'envoyer la variante n ° 42
  • Le serveur envoie Etag: variant42-version1 et Vary: If-none-match
  • La prochaine fois que cet utilisateur voudra accéder à la page, il ajoutera vraisemblablement If-none-match: variant42-version1 et tentera donc de le récupérer dans le cache.
  • Cependant, il n'y a pas une telle entrée dans le cache. Mais une nouvelle requête du serveur provoquera à nouveau une réponse avec cet Etag, qui sera mis en cache pour le futur.
  • Si le même utilisateur souhaite accéder à la page une troisième fois, il ajoutera à nouveau If-none-match: variant42-version1 et le contenu en cache lui sera alors servi.

Le problème avec ceci est le cas initial d'aucun Etag du tout. Ce sont les premiers visiteurs pour lesquels l'évaluation compliquée de la version à servir doit être effectuée - mais nous devrions tout de même modifier les en-têtes d'origine au lieu de Si-aucun-match ... un cercle vicieux.

Cela peut-il être fait? (Ou est-ce que l'effet souhaité de réduction des variantes pouvant être cachées peut être obtenu différemment?)

6
Hagen von Eitzen

Sur la base de votre question et de votre commentaire de clarification, il serait préférable d'utiliser l'URL plutôt que l'en-tête afin de mieux gérer les serveurs de mise en cache en aval. En d'autres termes, la première fois que vous établissez la connexion, vérifiez l'en-tête de la langue, puis redirigez-le vers le contenu approprié via une URL (quelque chose comme www.domain.com/en/ ou www.domain.com/de). En faisant cela, vous ne devrez rien faire de spécial pour la mise en cache des serveurs. De plus, certains serveurs de mise en cache ne sont pas correctement configurés pour prendre en charge les variantes sur les pages et peuvent donc casser les modifications de langue basées sur l'en-tête (l'utilisateur veut l'allemand mais la version anglaise est mise en cache et renvoyée par le serveur de mise en cache).

Même les plus grands sites sur Internet, tels que Microsoft, insèrent le code de langue dans l'URL pour assurer la meilleure prise en charge des serveurs de mise en cache en aval.

1
Chris Rutherfurd