Подтвердить что ты не робот

Несколько заголовков Set-cookie в HTTP

Я пишу небольшой класс, который действует как очень простой HTTP-клиент. В рамках проекта, над которым я работаю, я делаю это в cookie. Однако мне непонятно, что произойдет, когда мой клиент получит несколько заголовков "Set-Cookie" с тем же ключом, но установлены разные значения.

Например,

Set-Cookie: PHPSESSID=abc; path=/
Set-Cookie: PHPSESSID=def; path=/
Set-Cookie: PHPSESSID=ghi; path=/

Какой из них должен быть значением для PHPSESSID? Обычно это происходит, когда вы вызываете session_start(), а затем session_regenerate_id() на той же странице. Каждый будет устанавливать свой собственный заголовок. Все браузеры, похоже, все в порядке с этим, но я не могу заставить своего клиента выбрать правильный вариант.

Любые идеи?!

4b9b3361

Ответ 1

RFC 6265 раздел 4.1.2:

Если пользовательский агент получает новый файл cookie с тем же именем cookie,
домен-значение и значение пути в качестве файла cookie, который он уже сохранил,
существующий cookie вытесняется и заменяется новым файлом cookie.
Обратите внимание, что серверы могут удалять файлы cookie, отправив пользовательский агент

новый файл cookie с атрибутом Expires со значением в прошлом.

Итак, я обрабатывал заголовки в порядке и записывал их, если есть дубликат. Поэтому в вашем случае у вас будет только один PHPSESSID = ghi.

Ответ 2

RFC 6265 утверждает:

Серверы НЕ ДОЛЖНЫ включать более одного поля заголовка Set-Cookie в том же ответе с тем же именем cookie.

Поэтому я был бы очень обеспокоен тем, что ваша служба отправляет несколько заголовков Set-Cookie с тем же ключом. Особенно потому, что я видел, что пользовательские агенты и прокси ведут себя неожиданно - иногда беря значение первого заголовка, иногда переставляя заголовки.

Как клиент, типичное поведение пользовательского агента, похоже, должно принимать значение последнего заголовка. RFC ссылается на это поведение с этим утверждением:

Если пользовательский агент получает новый файл cookie с тем же именем, значением домена и значением пути в качестве файла cookie, который он уже сохранил, существующий файл cookie выгружается и заменяется новым файлом cookie.