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