Відповідь на статтю про SitePoint є не зовсім повною. Будь ласка, дивіться RFC 6265 (для справедливості, цей RFC був випущений в 2011 році після публікації цього питання, який замінює попередні RFC 2965 від 2000 року та RFC 2109 від 1997 року).
У підрозділі 2 розділу 5.4 сказано:
Агент користувача СЛІД сортувати список файлів cookie в такому порядку:
- Файли cookie з довшими контурами перераховані перед файлами cookie з коротшими контурами.
ПРИМІТКА: Не всі користувацькі агенти сортують список файлів cookie у цьому порядку, але цей порядок відображає загальну практику, коли цей документ був написаний, і, історично склалося, існували сервери, які (помилково) залежали від цього замовлення.
У розділі 4.2.2 також є ця маленька перлина :
... сервери НЕ ПОВИННІ покладатися на порядок серіалізації. Зокрема, якщо заголовок Cookie містить два файли cookie з однаковим іменем (наприклад, які були встановлені з різними атрибутами Шлях або Домен), сервери НЕ ПОВИННІ покладатися на порядок, у якому ці файли 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 = /; Path = /; Версія = 1
- Set-cookie: a = 2 & path = / example; Path = / example; Версія = 1
Обидва ці обхідні шляхи вимагають додаткової логіки на сервері для вибору бажаного значення файлу cookie, порівнюючи запитану URL-адресу зі списком доступних файлів cookie. Це не надто красиво. Це сумно RFC , НЕ завбачливо вимагати , що довший шлях повністю перекриває печиво з більш коротким шляхом (наприклад , в вашому прикладі, ви отримаєте Cookie: а = 2 тільки ).