La respuesta referente a un artículo sobre SitePoint no está del todo completa. Consulte RFC 6265 (para ser justos, este RFC se publicó en 2011 después de que se publicó esta pregunta, que sustituye a los anteriores RFC 2965 de 2000 y RFC 2109 de 1997).
Sección 5.4, inciso 2 tiene esto que decir:
El agente de usuario debería ordenar la galleta-lista en el siguiente orden:
- Galletas con trayectorias más largas se enumeran antes de galletas con caminos más cortos.
NOTA: No todos los agentes de usuario ordenar la cookie de lista en este orden, pero este orden refleja la práctica común cuando este documento fue escrito, y, servidores históricamente, ha habido que (erróneamente) dependían de este orden.
También existe esta pequeña joya en la sección 4.2.2:
... Los servidores no debe confiar en el orden de serialización. En en particular, si el encabezado Cookie contiene dos cookies con el mismo nombre (por ejemplo, que se establecieron con diferentes atributos de ruta o de dominio), los servidores NO DEBEN depender del orden en que aparecen estas cookies en el encabezado.
En su ejemplo solicitud cookie (Cookie: a = 2; a = 1) tenga en cuenta que la cookie establece con el camino /ejemplo (a = 2) tiene una trayectoria más larga que la con la ruta / (a = 1), por lo que se le enviará primero en línea, lo que coincide con la recomendación de la especificación. Por lo tanto, usted es más o menos correcto al suponer que podría seleccionar el primer valor.
Por desgracia, el lenguaje utilizado en los RFC es muy específica - el uso de las palabras DEBE y NO DEBE generar una ambigüedad en el RFC. Estos indican convenciones que deben seguir, pero no son requeridas para cumplir con la especificación. Si bien entiendo bastante bien el RFC para esto, 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 puedan enviar la cookie de ruta más larga (p. ej .: /ejemplo) primero en el encabezado Cookie:.
Si está en condiciones de controlar el valor de la cookie y usted desea hacer su infalible solución, que es el mejor de ambos:
utilizando un nombre de cookie distinta para anular en ciertos caminos, tales como:
- Set-cookie: a-mundial = 1; Path = /; versión = 1
- Set-cookie: a-ejemplo = 2; Path =/ejemplo; versión = 1
almacenar la ruta de acceso que necesita en el valor de la cookie en sí:
- Set-Cookie: a = 1 & path = /; Path = /; versión = 1
- Set-Cookie: a = 2 & path =/ejemplo; Path =/ejemplo, versión = 1
dos de estas soluciones requieren una lógica adicional en el servidor para escoger el valor de la cookie deseada, mediante la comparación de la URL solicitada con la lista de cookies disponibles . No es muy bonito. Es desafortunado que el RFC no tuvo la previsión de exigir 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 = 2solamente).
Haré todo lo posible (léase: todo lo que pueda) para evitar nombres duplicados de cookies. La mayoría de la gente nunca se ha encontrado con este problema, por una buena razón. –