Question

Bonjour,

Comment puis-je désactiver ETag (s) dans Ruby on Rails v2.3.5

Quand je fais une demande directe au RoR / Mongrel un en-tête ETag est présent.

TIA,

-Daniel

Était-ce utile?

La solution

beaucoup plus facile:

config.middleware.delete Rack::ETag

Autres conseils

La mise response.etag = nil dans un before_filter ne fonctionne pas. Le ETAG est généré juste avant que la réponse est envoyée (il est caluculated du corps si après tout le rendu a été fait).

La solution appropriée pour désactiver l'utilisation de ETAG et génération (et ainsi d'économiser les dépenses de temps en md5) il ce patch de singe:

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

Il y a une méthode setter etag sur l'objet ActionController::Response, qui supprime l'en-tête HTTP ETag si elle est vide, alors vous devriez juste être en mesure de préciser dans votre contrôleur (probablement dans un filtre avant):

response.etag = nil

Je ne pense pas qu'ils sont activés par défaut.

Si je comprends bien qu'ils doivent être explicitement en utilisant rassis? / Appel ou similaire fresh_when.

Je travaille dans Rails 4 sur WEBrick, en essayant d'obtenir une réponse en cache jusqu'à ce qu'il expire à un moment précis chaque jour. Il semble que le interfère avec le cache d'expiration ETag généré d'auto-qui est la raison pour laquelle je recherchais cette réponse. Je ne trouve pas quelque chose d'utile, mais je ne résoudre mon problème, donc je vais partager.

tl; dr Définissez l'en-tête Last-Modified

Mais le mettre à quoi? Dans ma situation, je suis en train d'optimiser un service Web qui a donné les résultats d'un processus qui fonctionne en même temps tous les jours. Mes têtes de réponse a fini par ressembler à ceci:

response.headers['Cache-Control'] = "max-age=86400"
response.headers['Expires'] = getCacheTime
response.headers['Last-Modified'] = getLastModified

D'abord, vous voulez écrire explicitement l'en-tête de Cache-Control pour écraser la valeur par défaut est tout. J'ai mis le mien d'être 24 heures pour coïncider avec le maximum de mon en-tête d'expiration. Je mets l'en-tête d'expiration d'une fonction du ressemble à ceci:

def getCacheTime
    now = Time.now.utc
    cacheTime = Time.utc(now.year, now.month, now.day, 22, 00, 00)
    if now > cacheTime
        cacheTime = cacheTime + (60 * 60 * 24)
    end

    cacheTime.httpdate
end

getLastModified fonction retourne exactement 24 heures de moins que la getCacheTime fonction. Il semble que la définition de cette supprimera la ETag (un autre en-tête de la mise en cache de validation) au moins dans mon environnement de développement actuel.

Pourquoi ne pas ajouter un before_filter dans votre contrôleur d'application qui fixe ETAG à zéro?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top