2010-09-27 4 views
23

Tôi đang viết một lớp nhỏ hoạt động như một máy khách HTTP cơ bản. Là một phần của một dự án tôi đang làm việc, tôi đang làm cho nó nhận thức được cookie. Tuy nhiên, nó không rõ ràng với tôi những gì xảy ra khi khách hàng của tôi nhận được nhiều tiêu đề "Set-Cookie" với cùng một khóa nhưng các giá trị khác nhau được thiết lập.Nhiều tiêu đề Set-cookie trong HTTP

Ví dụ,

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

Mà một trong những được coi là giá trị cho PHPSESSID? Điều này thường xảy ra khi bạn gọi session_start() và sau đó session_regenerate_id() trên cùng một trang. Mỗi bộ sẽ đặt tiêu đề của riêng nó. Tất cả các trình duyệt dường như không quan trọng với điều này, nhưng tôi dường như không thể khiến khách hàng của tôi chọn đúng.

Bất kỳ ý tưởng nào ?!

Trả lời

2

Câu trả lời được cho là ở số draft-ietf-httpstate-cookie.

+1

Kể từ khi đăng, điều này đã bị thay thế bởi RFC 6265. –

21

RFC 6265 section 4.1.2 trạng thái:

Nếu user agent nhận một cookie mới với cùng cookie tên,
miền có giá trị, và đường dẫn có giá trị như một cookie mà nó đã lưu trữ,
sự cookie hiện tại bị loại bỏ và được thay thế bằng cookie mới.
Lưu ý rằng máy chủ có thể xóa cookie bằng cách gửi cho tác nhân người dùng
cookie mới có thuộc tính Hết hạn có giá trị trong quá khứ.

Vì vậy, tôi sẽ xử lý các tiêu đề theo thứ tự và ghi đè chúng nếu có bản sao. Vì vậy, trong trường hợp của bạn, bạn sẽ chỉ có một PHPSESSID = ghi.

10

RFC 6265 trạng thái:

Servers KHÔNG NÊN bao gồm nhiều hơn một lĩnh vực tiêu đề Set-Cookie trong cùng một phản ứng với cùng Cookie-name.

Do đó, tôi sẽ rất quan tâm nếu dịch vụ của bạn gửi nhiều tiêu đề Set-Cookie bằng cùng một khóa. Đặc biệt là vì tôi đã thấy các tác nhân người dùng và proxy hoạt động bất ngờ - đôi khi lấy giá trị của tiêu đề đầu tiên, đôi khi sắp xếp lại các tiêu đề.

Là khách hàng, hành vi của tác nhân người dùng điển hình dường như là lấy giá trị của tiêu đề cuối cùng. RFC ám chỉ hành vi đó với tuyên bố này:

Nếu tác nhân người dùng nhận cookie mới có cùng tên cookie, giá trị tên miền và giá trị đường dẫn như cookie đã lưu trữ, hiện tại cookie bị đuổi và được thay thế bằng cookie mới.

+0

Không nói rằng không nên gửi nhiều tiêu đề bộ cookie. Nó nói nhiều tiêu đề với cùng một tên cookie. – Blaze

+0

Cố định, trong trường hợp không rõ ràng từ ngữ cảnh của OP. –