La respuesta que hace referencia a un artículo en SitePoint no está del todo completa. Consulte RFC 6265 (para ser justos, este RFC se publicó en 2011 después de que se publicara esta pregunta, que reemplaza al RFC 2965 anterior de 2000 y al RFC 2109 de 1997).
La sección 5.4 , subsección 2 tiene esto que decir:
El agente de usuario DEBE ordenar la lista de cookies en el siguiente orden:
- Las cookies con rutas más largas se enumeran antes que las cookies con rutas más cortas.
NOTA: No todos los agentes de usuario clasifican la lista de cookies en este orden, pero este orden refleja una práctica común cuando se escribió este documento e, históricamente, ha habido servidores que (erróneamente) dependían de este orden.
También está esta pequeña joya en la sección 4.2.2 :
... los servidores NO DEBEN depender del orden de serialización. En particular, si el encabezado de la cookie contiene dos cookies con el mismo nombre (por ejemplo, que se establecieron con diferentes atributos de ruta o dominio), los servidores NO DEBEN depender del orden en el que aparecen estas cookies en el encabezado.
En su cookie de solicitud de ejemplo ( Cookie: a = 2; a = 1 ) tenga en cuenta que la cookie configurada con la ruta / ejemplo ( a = 2 ) tiene una ruta más larga que la que tiene la ruta / ( a = 1 ) y por lo tanto se le envía el primero en la fila, que coincide con la recomendación de la especificación. Por lo tanto, está más o menos en lo correcto al suponer que podría seleccionar el primer valor.
Desafortunadamente, el lenguaje utilizado en las RFC es extremadamente específico: el uso de las palabras DEBE y NO DEBE introducir ambigüedad en las RFC. Estos indican convenciones que deben seguirse, pero no es necesario que cumplan con la especificación. Si bien entiendo el RFC para esto bastante bien, no he hecho la investigación para ver qué hacen los clientes del mundo real; Es posible que uno o más navegadores u otros softwares que actúen como clientes HTTP no envíen la cookie de ruta más larga (por ejemplo: / ejemplo ) primero en el encabezado Cookie:.
Si está en condiciones de controlar el valor de la cookie y desea que su solución sea infalible, lo mejor es:
usando un nombre de cookie diferente para anular en ciertas rutas, como:
- Establecer-cookie: a-global = 1; Ruta = /; Versión = 1
- Set-cookie: a-example = 2; Ruta = / ejemplo; Versión = 1
almacenar la ruta que necesita en el valor de la cookie en sí:
- Establecer-cookie: a = 1 & ruta = /; Ruta = /; Versión = 1
- Set-cookie: a = 2 & ruta = / ejemplo; Ruta = / ejemplo; Versión = 1
Ambas soluciones requieren lógica adicional en el servidor para elegir el valor de cookie deseado, comparando la URL solicitada con la lista de cookies disponibles. No es demasiado bonito. Es lamentable que el RFC no haya tenido la previsión de requerir que una ruta más larga anule por completo una cookie con una ruta más corta (por ejemplo: en su ejemplo, recibiría Cookie: a = 2 solamente ).