La réponse faisant référence à un article sur SitePoint n'est pas entièrement complète. Veuillez consulter la RFC 6265 (pour être honnête, cette RFC a été publiée en 2011 après la publication de cette question, qui remplace la RFC 2965 précédente de 2000 et la RFC 2109 de 1997).
La section 5.4 , sous-section 2, dit ceci:
L'agent utilisateur DEVRAIT trier la liste de cookies dans l'ordre suivant:
- Les cookies avec des chemins plus longs sont répertoriés avant les cookies avec des chemins plus courts.
REMARQUE: tous les agents utilisateurs ne trient pas la liste des cookies dans cet ordre, mais cet ordre reflète la pratique courante lors de la rédaction de ce document et, historiquement, il y a eu des serveurs qui dépendaient (à tort) de cet ordre.
Il y a aussi ce petit bijou dans la section 4.2.2 :
... les serveurs NE DEVRAIENT PAS s'appuyer sur l'ordre de sérialisation. En particulier, si l'en-tête Cookie contient deux cookies avec le même nom (par exemple, qui ont été définis avec des attributs de chemin ou de domaine différents), les serveurs NE DEVRAIENT PAS s'appuyer sur l'ordre dans lequel ces cookies apparaissent dans l'en-tête.
Dans votre exemple de cookie de demande ( Cookie: a = 2; a = 1 ) notez que le cookie défini avec le chemin / exemple ( a = 2 ) a un chemin plus long que celui avec le chemin / ( a = 1 ) et donc il vous est renvoyé en premier, ce qui correspond à la recommandation de la spécification. Ainsi, vous avez plus ou moins raison de supposer que vous pourriez sélectionner la première valeur.
Malheureusement, le langage utilisé dans les RFC est extrêmement spécifique - l'utilisation des mots DEVRAIT et NE DEVRAIT PAS introduire d'ambiguïté dans les RFC. Celles-ci indiquent les conventions qui doivent être suivies, mais ne sont pas tenues d'être conformes à la spécification. Bien que je comprenne assez bien la RFC pour cela, je n'ai pas fait de recherche pour voir ce que font les clients du monde réel; il est possible qu'un ou plusieurs navigateurs ou autres logiciels agissant en tant que clients HTTP ne puissent pas envoyer le cookie de chemin le plus long (par exemple: / exemple ) en premier dans l'en- tête Cookie :.
Si vous êtes en mesure de contrôler la valeur du cookie et que vous souhaitez rendre votre solution infaillible, il vaut mieux:
en utilisant un nom de cookie différent pour remplacer certains chemins, tels que:
- Set-cookie: a-global = 1; Chemin = /; Version = 1
- Set-cookie: un-exemple = 2; Chemin = / exemple; Version = 1
stocker le chemin dont vous avez besoin dans la valeur du cookie elle-même:
- Set-cookie: a = 1 & path = /; Chemin = /; Version = 1
- Set-cookie: a = 2 & path = / exemple; Chemin = / exemple; Version = 1
Ces deux solutions de contournement nécessitent une logique supplémentaire sur le serveur pour sélectionner la valeur de cookie souhaitée, en comparant l'URL demandée à la liste des cookies disponibles. Ce n'est pas trop joli. Il est regrettable que la RFC n'ait pas eu la prévoyance d'exiger qu'un chemin plus long remplace complètement un cookie avec un chemin plus court (par exemple: dans votre exemple, vous recevriez Cookie: a = 2 uniquement ).