web-dev-qa-db-fra.com

Comment appliquer le cache de contrôle en amont CORS à un domaine entier

Je crée une REST application qui utilise CORS. Chaque REST appel est différent et je trouve qu'il y a une surcharge importante pour obtenir l'appel OPTIONS de contrôle en amont) Existe-t-il un moyen de mettre en cache et d'appliquer un résultat OPTIONS de contrôle en amont afin que tout appel ultérieur au même domaine utilise la réponse mise en cache?

73
MindWire

Le contrôle en amont ne peut être appliqué qu'à la demande, pas à l'ensemble du domaine. J'ai posé la même question sur la liste de diffusion et il y avait des problèmes de sécurité. Voici le fil complet: http://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0228.html

Il y a quelques éléments à considérer si vous souhaitez limiter le nombre de demandes de contrôle en amont. Tout d'abord, notez que les navigateurs WebKit/Blink définissent un cache de contrôle en amont maximal de 10 minutes:

https://github.com/WebKit/webkit/blob/master/Source/WebCore/loader/CrossOriginPreflightResultCache.cpphttps://chromium.googlesource.com/chromium/blink/ +/master/Source/core/loader/CrossOriginPreflightResultCache.cpp

(Je ne sais pas si cela est vrai pour les autres navigateurs). Ainsi, alors que vous devez toujours définir l'en-tête Access-Control-Max-Age, la valeur maximale est de 10 minutes.

Notez ensuite qu'il est impossible d'éviter un contrôle en amont sur les requêtes PUT/DELETE. Les mises à jour/suppressions de votre API nécessiteront donc au moins un contrôle en amont toutes les 10 minutes.

Sur GET/POST, évitez autant que possible les en-têtes personnalisés, car ils déclenchent toujours les contrôles en amont. Si votre API renvoie JSON, notez qu'un Content-Type de 'application/json' déclenche également un contrôle en amont.

Si vous êtes prêt à plier à quel point votre API est "RESTful", il y a quelques autres choses que vous pouvez essayer. La première consiste à utiliser un type de contenu qui n'a pas besoin d'un contrôle en amont, comme "text/plain". Les en-têtes personnalisés déclenchent toujours des contrôles en amont, donc si vous avez des en-têtes personnalisés, vous pouvez les déplacer dans les paramètres de requête. À l'extrême, vous pouvez utiliser un protocole comme JSON-RPC, où toutes les demandes sont adressées à un seul point de terminaison.

En toute honnêteté, en raison de la limite du cache de contrôle en amont du navigateur de 10 minutes et des URL des ressources de REST, le cache de contrôle en amont est assez inutile. Il y a très peu de choses que vous pouvez faire pour limiter les contrôles en amont au cours d'une application longue durée. J'espère que les auteurs de la spécification CORS tenteront de résoudre ce problème à l'avenir.

97
monsur

Essayez d'utiliser xDomain

Il était assez simple pour moi de configurer si vous utilisez angular ou jQuery. Sur votre serveur d'application, ajoutez un proxy.html comme indiqué dans l'aide sur le lien ci-dessous. Ajoutez quelques balises faisant référence au js fichiers sur votre "client" et alto, plus de pré-vols. Cela se termine par un iframe pour éviter d'avoir à vérifier les cors.

https://github.com/jpillora/xdomain

4
Chewy