Est-il possible de mettre en cache les méthodes POST dans HTTP?

Avec une sémantique de mise en cache très simple: si les parameters sont les mêmes (et que l’URL est la même, bien sûr), alors c’est un succès. Est-ce possible? Conseillé?

La RFC 2616 correspondante dans la section 9.5 (POST) permet la mise en cache de la réponse à un message POST, si vous utilisez les en-têtes appropriés.

Les réponses à cette méthode ne peuvent pas être mises en cache, sauf si la réponse inclut des champs d’en-tête Cache-Control ou Expires appropriés. Toutefois, la réponse 303 (See Other) peut être utilisée pour demander à l’agent utilisateur de récupérer une ressource pouvant être mise en cache.

Notez que la même RFC stipule explicitement dans la section 13 (Caching in HTTP) qu’un cache doit invalider l’entité correspondante après une requête POST.

Certaines méthodes HTTP DOIVENT provoquer un cache pour invalider une entité. Il s’agit soit de l’entité désignée par l’URI de demande, soit des en-têtes Emplacement ou Emplacement du contenu (le cas échéant). Ces méthodes sont les suivantes:

- PUT - DELETE - POST 

Je ne vois pas comment ces spécifications peuvent permettre une mise en cache significative.

Selon RFC 2616 Section 9.5:

“Les réponses à la méthode POST ne peuvent pas être mises en cache, SAUF si la réponse inclut des champs d’en-tête Cache-Control ou Expires appropriés.”

Donc, OUI, vous pouvez mettre en cache la réponse à la demande POST, mais uniquement si elle arrive avec les en-têtes appropriés. Dans la plupart des cas, vous ne voulez pas mettre la réponse en cache. Mais dans certains cas, par exemple si vous n’enregistrez aucune donnée sur le serveur, c’est tout à fait approprié.

Notez toutefois que de nombreux navigateurs, y compris Firefox 3.0.10, ne mettront pas en cache la réponse POST indépendamment des en-têtes. IE se comporte plus intelligemment à cet égard.

Maintenant, je veux dissiper une certaine confusion concernant la RFC 2616 S. 13.10. La méthode POST sur un URI n’invalide pas la ressource pour la mise en cache, comme certains l’ont indiqué ici. Il crée une version précédemment mise en cache de cet URI périmé, même si ses en-têtes de contrôle de cache indiquaient une fraîcheur de plus longue durée.

Global:

Fondamentalement, le POST n’est pas une opération idempotente . Vous ne pouvez donc pas l’utiliser pour la mise en cache. GET devrait être une opération idempotente, donc il est couramment utilisé pour la mise en cache.

S’il vous plaît voir la section 9.1 du HTTP 1.1 RFC 2616 S. 9.1 .

Autre que la sémantique de la méthode GET:

La méthode POST elle-même est sémantiquement conçue pour envoyer quelque chose à une ressource. POST ne peut pas être mis en cache, car si vous faites quelque chose une fois par rapport à deux fois par rapport à trois fois, vous modifiez la ressource du serveur à chaque fois. Chaque demande est importante et doit être livrée au serveur.

La méthode PUT elle-même est sémantiquement conçue pour mettre ou créer une ressource. C’est une opération idempotente, mais elle ne sera pas utilisée pour la mise en cache car un DELETE aurait pu se produire entre temps.

La méthode DELETE elle-même est sémantiquement destinée à supprimer une ressource. C’est une opération idempotente, mais elle ne sera pas utilisée pour la mise en cache car un PUT aurait pu se produire entre temps.

Concernant la mise en cache côté client:

Un navigateur Web transmettra toujours votre demande même si elle a une réponse d’une opération POST précédente. Par exemple, vous pouvez envoyer des e-mails avec Gmail à quelques jours d’intervalle. Ils peuvent être le même sujet et le même corps, mais les deux emails doivent être envoyés.

En ce qui concerne la mise en cache de proxy:

Un serveur proxy HTTP qui transmet votre message au serveur ne mettrait jamais en cache que des requêtes GET ou HEAD.

Concernant la mise en cache du serveur:

Un serveur par défaut ne traiterait pas automatiquement une requête POST en vérifiant son cache. Mais bien sûr, une demande POST peut être envoyée à votre application ou à votre complément et vous pouvez avoir votre propre cache à partir duquel vous lisez lorsque les parameters sont identiques.

Invalider une ressource:

Vérifier le HTTP 1.1 RFC 2616 S. 13.10 montre que la méthode POST doit invalider la ressource pour la mise en cache.

Si c’est quelque chose qui ne modifie pas réellement les données sur votre site, cela devrait être une requête GET. Même si c’est un formulaire, vous pouvez toujours le définir en tant que demande d’access. Alors que, comme d’autres le font remarquer, vous pouvez mettre en cache les résultats d’un test POST, cela n’a pas de sens sémantique car un POST, par définition, modifie les données.

Si vous mettez en cache une réponse POST, celle-ci doit être dans la direction de l’application Web. C’est ce que l’on entend par “Les réponses à cette méthode ne sont pas cachables, à moins que la réponse n’inclue des champs d’en-tête Cache-Control ou Expires appropriés.”

On peut supposer en toute sécurité que l’application, qui sait si les résultats d’un test POST sont idempotents ou non, décide de joindre ou non les en-têtes de contrôle du cache nécessaires et appropriés. Si des en-têtes suggérant la mise en cache sont autorisés, l’application vous indique que le POST est, en réalité, un super-GET; que l’utilisation de POST n’était requirejse qu’en raison de la quantité de données inutiles et non pertinentes (pour l’utilisation de l’URI en tant que clé de cache) nécessaires pour effectuer l’opération idempotente.

Les GET suivants peuvent être servis depuis le cache dans cette hypothèse.

Une application qui ne parvient pas à joindre les en-têtes nécessaires et corrects pour différencier les réponses POST cachables et non cachables est en faute pour tout résultat de mise en cache non valide.

Cela dit, chaque POST qui frappe le cache nécessite une validation utilisant des en-têtes conditionnels. Cela est nécessaire pour actualiser le contenu du cache afin d’éviter que les résultats d’un test POST ne soient répercutés dans les réponses aux demandes avant l’expiration de la durée de vie de l’object.

Bien sûr, c’est possible. Si vous souhaitez intercepter les requêtes POST envoyées à votre serveur et mettre en cache les données renvoyées pour qu’elles soient renvoyées ultérieurement – pas de transpiration.

La partie la plus délicate concerne l’état. Comment décidez-vous que les données que vous souhaitez renvoyer à l’utilisateur doivent être identiques? Que se passe-t-il si ses cookies ont changé – cela change-t-il les données que vous souhaitez renvoyer?

Que diriez-vous si l’utilisateur a fait une demande POST sur votre page d’accueil et, depuis la dernière fois, un autre utilisateur lui a envoyé un message (en utilisant un système de votre site). Vous devez identifier cela comme un changement d’état. , et envoyer la nouvelle version de votre page d’accueil, avec une notification du message à l’utilisateur la prochaine fois qu’il charge la page d’accueil. Même si les parameters POST sont identiques.

Mark Nottingham a analysé quand il était possible de mettre en cache la réponse d’un POST. Notez que les requêtes suivantes qui souhaitent tirer parti de la mise en cache doivent être des requêtes GET ou HEAD. Voir aussi httpbis

Les POST ne traitent pas les représentations de l’état identifié, 99 fois sur 100. Cependant, il y a un cas où cela se produit; lorsque le serveur se met en quatre pour dire que cette réponse POST est une représentation de son URI, en définissant un en-tête Content-Location identique à celui de la requête URI. Lorsque cela se produit, la réponse POST est comme une réponse GET au même URI; il peut être mis en cache et réutilisé – mais uniquement pour les futures demandes GET.

https://www.mnot.net/blog/2012/09/24/caching_POST .

Avec firefox 27.0 et avec httpfox, le 19 mai 2014, j’ai vu une ligne de ceci: 00: 03: 58.777 0.488 657 (393) POST (Cache) text / html https://users.jackiszhp.info/S4UP

Clairement, la réponse d’une méthode post est mise en cache, et elle est également en https. Incroyable!

POST est utilisé dans Ajax avec état. Renvoyer une réponse mise en cache pour un POST annule le canal de communication et les effets secondaires de la réception d’un message. C’est très, très mauvais. C’est aussi une vraie douleur à traquer. Fortement recommandé contre.

Un exemple sortingvial serait un message qui, comme effet secondaire, paie votre salaire 10 000 $ la semaine en cours. Vous ne voulez pas obtenir le “OK, il a traversé!” page précédente qui a été mise en cache la semaine dernière. D’autres cas plus complexes du monde réel entraînent une hilarité similaire.