Ответ, относящийся к статье на SitePoint, не является полностью полным. См. RFC 6265 (если честно, этот RFC был выпущен в 2011 году после публикации этого вопроса, который заменяет предыдущие RFC 2965 от 2000 года и RFC 2109 от 1997).
Раздел 5.4, подраздел 2 имеет следующее:
Пользовательский агент ДОЛЖЕН сортировать список файлов cookie в следующем порядке:
- Файлы cookie с более длинными путями перечислены перед файлами cookie с более короткими путями.
ПРИМЕЧАНИЕ. Не все пользовательские агенты сортируют список файлов cookie в этом порядке, но это
порядок отражает обычную практику, когда этот документ был написан, и,
исторически существовали серверы, которые (ошибочно) зависели от
этот заказ.
В разделе 4.2.2 также есть этот маленький драгоценный камень:
... серверам НЕ СЛЕДУЕТ полагаться на порядок сериализации. В
в частности, если заголовок Cookie содержит два файла cookie с одинаковыми
имя (например, которые были установлены с различными атрибутами пути или домена),
серверы НЕ ДОЛЖНЫ полагаться на порядок, в котором эти куки появляются в заголовке.
В вашем примере файла cookie запроса ( Cookie: a = 2; a = 1 ) обратите внимание, что файл cookie установлен с путем / example ( a = 2 * 1032) *) имеет более длинный путь, чем путь с / ( a = 1 ), и поэтому он отправляется обратно вам первым в строке, что соответствует рекомендации спецификации. Таким образом, вы более или менее правы в своем предположении, что вы могли бы выбрать первое значение.
К сожалению, язык, используемый в RFC, чрезвычайно специфичен - использование слов ДОЛЖНО и НЕ ДОЛЖНО вносить двусмысленность в RFC. Они указывают на соглашения, согласно которым следует , но не требуется , чтобы соответствовать спецификации. Хотя я достаточно хорошо понимаю RFC, я не провел исследования, чтобы увидеть, что делают клиенты в реальном мире; Возможно, что один или несколько браузеров или других программ, действующих как клиенты HTTP, могут не отправлять файл cookie с самым длинным путем (например: / example ) первым в заголовке Cookie: .
Если вы в состоянии контролировать значение файла cookie и хотите, чтобы ваше решение было надежным, лучше всего:
использование другого имени файла cookie для переопределения в определенных путях, например:
- Set-cookie: a-global = 1; Path = /; Version = 1
- Set-cookie: a-example = 2; Path = / example; Version = 1
сохранение нужного вам пути в самом значении cookie:
- Set-cookie: a = 1 & path = /; Path = /; Version = 1
- Set-cookie: a = 2 & path = / example; Path = / example; версия = 1
Оба эти обходных пути требуют дополнительной логики на сервере, чтобы выбрать желаемое значение cookie, сравнивая запрошенный URL-адрес со списком доступных cookie-файлов. Это не слишком красиво. К сожалению, у RFC не было предвидения требовать, чтобы более длинный путь полностью заменял cookie-файл с более коротким путем (например: в вашем примере вы получите Cookie: a = 2 только ).