Ubuntu -> Apache -> Phusion Passenger -> Rails 2.3
La partie principale de mon site réagit à vos clics. Ainsi, si vous cliquez sur un lien, il vous dirigera vers la destination et régénérera instantanément votre page.
Mais, si vous appuyez sur le bouton de retour, vous ne voyez pas la nouvelle page. Malheureusement, il n'apparaît pas sans une actualisation manuelle; il semble que le navigateur le met en cache. Je veux m'assurer que le navigateur ne cache pas la page.
Séparément, je fais veux fixer des dates d'expiration extrême futures pour tous mes actifs statiques.
Quelle est la meilleure façon de résoudre ce problème? Dois-je résoudre ce problème dans Rails? Apache? Javascript?
Merci pour toute votre aide, Jason
Hélas. Aucune de ces suggestions n'a forcé le comportement que je recherche.
Peut-être qu'il y a une réponse javascript? Je pourrais demander aux rails d'écrire un horodatage dans un commentaire, puis demander au javascript de vérifier si les temps sont dans les cinq secondes (ou ce qui fonctionne). Si oui, alors très bien, mais si non, alors rechargez la page?
Pensez-vous que cela fonctionnerait?
Merci pour votre aide,
Jason
la source
Cache-Control: no-store
que tant que le navigateur est compatible avec HTTP 1.1. Section 14.9.2 Ce qui peut être stocké par les cachesutilisation:
http://api.rubyonrails.org/classes/ActionController/ConditionalGet.html#method-i-expires_now
la source
expires_now
envoie uniquement l'en-no-cache
tête. Selon le navigateur, cela peut ne pas suffire. (Par exemple, Firefox veut unno-store
pour les connexions non-HTTPS: developer.mozilla.org/en/docs/Using_Firefox_1.5_caching )no-store
est également nécessaire.J'ai utilisé cette ligne avec un certain succès dans le contrôleur. Cela fonctionne dans Safari et Internet Explorer mais je ne l'ai pas vu fonctionner avec Firefox.
Pour votre deuxième point, si vous utilisez les méthodes d'assistance des rails comme
et laissez les paramètres par défaut sur votre serveur Web, les actifs sont généralement assez bien mis en cache.
la source
1.year.ago
est une surcharge inutile. Il suffit de choisir un moment arbitraire dans le passé commeFri, 01 Jan 1990 00:00:00 GMT
La manière la plus propre serait d'écrire un middleware Rack, qui modifie l'en-tête Cache-Control en fonction d'une logique (par exemple, uniquement pour le type mime application / xml). Ou, pour une approche plus moche, mais toujours efficace, on pourrait changer la constante ActionDispatch :: Response :: DEFAULT_CACHE_CONTROL en 'no-cache'. Bien sûr, si la granularité du contrôleur et / ou de l'action est requise, il est préférable de le faire dans le contrôleur.
la source
Point à noter: vous ne pouvez pas effacer conditionnellement le cache (comme si un
before_filter
appelait uniquementreset_cache
si l'utilisateur y était déjà). Vous devez vider le cache de manière inconditionnelle , car le navigateur ne fera pas de nouvelle demande juste pour voir si cette fois, il a besoin de se recharger, même s'il n'a pas eu besoin de la dernière fois.Exemple:
ne fonctionnera pas pour empêcher les utilisateurs de revenir après y avoir été, car le navigateur utilise les en-têtes de cache d'origine sur le bouton Retour.
fonctionnera, cependant (après avoir actualisé la page et vidé le cache avant que vous ne l'ajoutiez, évidemment), puisque, à la première demande, le navigateur obtiendra le
no-cache, no-store, ...
et l'appliquera aux futurs chargements de page.la source
no_cache_control
Gemme.Si vous avez besoin de faire cela pour toutes les réponses, par exemple pour passer un test de pénétration (BURP, Detectify, etc.), vous pouvez installer ce Gem on Rails 4+ afin d'ajouter les en-têtes suivants à toutes les réponses:
Fonctionne comme un charme et est vraiment la bonne voie à suivre pour des applications Web HTTPS sécurisées qui nécessitent une authentification pour faire quoi que ce soit.
la source