La réponse qui fait référence à un article sur SitePoint n'est pas tout à fait complète. Veuillez consulter RFC 6265 (pour être juste, cette RFC a été publiée en 2011 après que cette question ait été postée, ce qui remplace les précédentes RFC 2965 de 2000 et RFC 2109 à partir de 1997).
Section 5.4 le paragraphe 2 est ainsi libellé :
L'agent utilisateur DEVRAIT trier la liste des cookies dans l'ordre suivant :
- Les cookies dont le parcours est plus long sont énumérés avant les cookies dont le parcours est plus court.
NOTE : Tous les agents utilisateurs ne trient pas la liste des cookies dans cet ordre, mais cet ordre reflète la pratique courante au moment de la rédaction de ce document. mais cet ordre reflète la pratique courante lorsque ce document a été écrit, et, historiquement, il y a eu des serveurs qui dépendaient (à tort) de cet ordre. cet ordre.
Il y a aussi ce petit bijou dans la section 4.2.2 :
... les serveurs NE DOIVENT PAS se fier à l'ordre de sérialisation. Sur En particulier, si l'en-tête Cookie contient deux cookies portant le même nom nom (par exemple, qui ont été définis avec des attributs Path ou Domain différents), les serveurs NE DOIVENT PAS se fier à l'ordre dans lequel ces cookies apparaissent dans l'en-tête.
Dans votre exemple, le 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 de la trajectoire / ( a=1 ) et il vous est donc renvoyé en premier, ce qui correspond à la recommandation de la spécification. Ainsi, vous avez plus ou moins raison de supposer que vous pourrait sélectionner la première valeur.
Malheureusement, le langage utilisé dans les RFC est extrêmement spécifique - l'utilisation des mots DEVRAIT y NE DEVRAIT PAS introduisent des ambiguïtés dans les RFC. Ceux-ci indiquent les conventions qui debe à suivre, mais ne sont pas requis pour être conforme à la spécification. Bien que je comprenne très bien la RFC à ce sujet, je n'ai pas fait de recherches 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 n'envoient pas le cookie du chemin le plus long (ex : /exemple ) premier dans la Cookie : en-tête.
Si vous êtes en mesure de contrôler la valeur du cookie et que vous voulez que votre solution soit infaillible, il est préférable de choisir l'une des deux solutions suivantes :
- utiliser un nom de cookie différent pour passer outre dans certains chemins, par exemple :
- Set-cookie : a-global=1;Path=/;Version=1
- Set-cookie : a-example=2;Path=/example;Version=1
- en stockant le chemin dont vous avez besoin dans la valeur du cookie elle-même :
- Set-cookie : a=1&path=/;Path=/;Version=1
- Set-cookie : a=2&path=/exemple;Path=/exemple;Version=1
Ces deux solutions de contournement nécessitent une logique supplémentaire sur le serveur pour choisir la valeur de cookie souhaitée, en comparant l'URL demandée à la liste des cookies disponibles. Ce n'est pas très joli. Il est regrettable que la RFC n'ait pas eu la clairvoyance 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 ).
2 votes
Je ferais de mon mieux (lire : tout ce que je peux) pour éviter de dupliquer les noms de cookies. La plupart des gens n'ont jamais rencontré ce problème - pour une bonne raison.
0 votes
Le site web ne peut lire que son propre cookie. Il ne peut pas lire le cookie d'un autre site/domaine. Cette sécurité est assurée par le navigateur. Ceci peut être un conseil pour les débutants absolus (j'ai eu cette confusion).
4 votes
@Arun - mais il peut lire les sous-domaines. Et c'est de là que vient généralement la confusion.