9
votes

Ruby sur rails, comment désactiver / éteindre etag

salutations,

Comment puis-je éteindre Etag (s) etag (s) dans Ruby sur Rails V2.3.5

Lorsque je fais une demande directe à la ROR / MONGREL, un en-tête Etag est présent.

TIA,

-Daniel


0 commentaires

6 Réponses :


0
votes

Je ne pense pas qu'ils sont sur défaut.

Ma compréhension est qu'elles doivent être explicitement définies à l'aide de Stale? / Fresh_Qui appelle ou similaire.


1 commentaires

J'ai vérifié le contrôleur, il n'y a pas de code GET conditionnel. -Daniel



1
votes

Il y a un Etag code> Setter Méthode sur l'objet ActionController :: Réponse CODE> Objet, qui supprime l'en-tête HTTP Etag si elle est vide, vous devriez donc être capable de l'effacer dans votre contrôleur (probablement dans un filtre avant):

response.etag = nil


1 commentaires

Oui, mais j'ai besoin de le faire pour toutes les réponses, alors que je pouvais le faire pour chaque contrôleur, qui deviendrait fastidieux après un certain temps et que vous soyez une erreur sujette. Et si quelqu'un a raté un?



-1
votes

Pourquoi ne pas ajouter un avant_filter dans votre contrôleur d'application qui définit etag à nil?


2 commentaires

Je préférerais ne pas avoir à ajuster quelque plus de 30 contrôleurs plus de 30+ et à vous assurer que tout le monde la définit à l'avenir. :)


Si vous mettez l'avant_filter dans votre application_Controller, il est exécuté pour tous les contrôleurs, et si, pour une raison quelconque, vous avez un contrôleur qui doit générer des eTags, il suffit d'utiliser skip_be_filter.



4
votes

Mettre en place réponse.etag = nil code> dans un fichier avant_filter ne fonctionne pas. L'Etag est généré juste avant que la réponse soit envoyée (elle est calculée à partir du corps de manière à ce que tout le rendu a été effectué).

La solution de contournement appropriée pour désactiver l'utilisation et la génération d'Etag (et permet de consigner les dépenses de temps dans MD5). Ce singe PATCH: P>

module ActionController
  class Request
    # never match any incomming etag
    def etag_matches?(etag)
      false
    end
  end

  class Response
    # fake rails that our response already has an etag set and so none is generated automatically
    def etag?
      true
    end
  end
end


0 commentaires

25
votes

beaucoup plus facile: xxx


2 commentaires

Cela fonctionne-t-il pour les rails 2.3 (comme demandé par l'OP), ou c'est des rails-3 seulement?


C'était potentiellement la réponse la plus utile que j'ai vue à ce sujet.



0
votes

Je travaille dans des rails 4 sur Webrick, essayant de répondre au cache jusqu'à ce qu'il expire à une heure précise chaque jour. On dirait que l'ETAG généré automatiquement interfère avec le cache d'expiration qui est pourquoi j'ai recherché cette réponse. Je n'ai rien trouvé utile ici, mais je résolvai mon problème, je vais donc partager.

TL; DR Définit le Dernier modifié

mais défini à quoi? Dans ma situation, j'essayais d'optimiser un service Web qui a renvoyé les résultats d'un processus qui fonctionne à la fois tous les jours. Mes en-têtes de réponse ont fini par ressembler à ceci: xxx

Vous voulez d'abord écrire explicitement l'en-tête Cache-Control pour écraser la défaillance de la valeur par défaut. Je fixe la mienne à 24 heures pour coïncider avec le maximum de mon en-tête d'expiration. J'ai défini l'en-tête d'expiration avec une fonction qui ressemble à ceci comme suit: xxx

la fonction getlastmodifié fonctionne exactement 24 heures de moins que le getcachetime fonction. Il semble que cela puisse définir cela supprimera l'ETAG (un autre en-tête de mise en cache de validation) au moins dans mon environnement de développement actuel.


0 commentaires