2011-01-21 3 views
8

Nous développons un grand site Web, et toutes nos images et ressources sont dans Amazon S3. Nous utilisons également Cloudfront pour distribuer notre contenu à l'échelle mondiale. Ce que nous voulons, c'est de dire au navigateur Web des clients de mettre en cache nos fichiers, car lorsque nous les modifions, nous changeons également l'URL (Cloudfront ne reflète pas le changement pour 24 heures ailleurs).Lorsque vous utilisez Cloudfront, comment définir l'en-tête Expires par rapport à la date actuelle?

Nous utilisons actuellement ETags mais ce n'est pas optimal car le client doit toujours faire la demande pour vérifier si la ressource a changé. Une solution serait l'en-tête Expires, mais nous n'avons pas trouvé le moyen de la définir par rapport à la date actuelle dans la configuration d'Apache pour S3, et nous ne pouvons pas mettre à jour tout le contenu régulièrement, car c'est à peu près. Nous aurions donc besoin d'une option de configuration qui définit l'en-tête Expires à une date par rapport à la date actuelle pour tout le contenu.

Une autre solution serait de définir Cache-Control: max-age à une certaine valeur. Est-ce que ça marche? Est-il accepté par les principaux navigateurs? Vais-je détruire certains algorithmes de mise en cache avec ceci? Pourquoi YSlow recommande-t-il de définir l'en-tête Expires mais pas Cache-Control: max-age?

Avez-vous d'autres recommandations? Nous compressons CSS et JS, en utilisant Sprites où c'est plausible, en définissant des en-têtes Expires et des ETags où c'est possible, et nous allons bientôt compresser nos images avec Yahoo Compression Tool et gzipping Output.

Répondre

3

Nous avons fait quelques recherches sur nous-même. On dirait que l'en-tête Cache-Control aide à dire à Cloudfront ou à un proxy de définir un en-tête Expires valide, mais seulement parfois ...

Nous sommes en train d'écrire un Cron Job pour mettre à jour tous les en-têtes du S3 régulièrement, parce que est une chose qui fonctionne à coup sûr. On dirait qu'il n'y a pas d'autre moyen. Je vous tiendrai au courant s'il y a. Pourquoi avez-vous besoin de la durée du cache par rapport à la date actuelle?

+0

Salut Paul, j'ai le même problème, avez-vous géré une meilleure solution? – ic3

+0

Non, AFAIK il n'y a pas de meilleure solution. –

+0

@PaulWeber pouvez-vous partager un aperçu de ce que vous avez fait J'ai aussi besoin de faire le même genre de chose – msonowal

2

vous avez dit:

"quand nous les changeons, nous allons aussi changer l'URL"

Ce qui me signifie que vos ressources jamais changement. Pourquoi ne pas définir un en-tête Expires à une date ultérieure très éloignée (01/01/2020 par exemple)?

+0

Bonne idée. Je ne sais pas pourquoi nous avons abandonné cette solution, mais je pense que c'était parce que si la date d'expiration est trop loin dans le futur, certains navigateurs ou Proxys l'ignoreront. Nous laissons actuellement notre contenu expirer dans 1 an, cela fonctionne, mais nous pourrions essayer d'augmenter cela. –

+1

[RFC-2616] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html) section 14.21 dit "Pour marquer une réponse comme 'n'expire jamais', un serveur d'origine envoie une date d'expiration d'environ un année à compter de l'envoi de la réponse, les serveurs HTTP/1.1 NE DEVRAIENT PAS envoyer les dates Expires plus d'un an dans le futur. " Je ne sais pas si c'est réellement un problème dans la pratique. – Carson63000

Questions connexes