Câu trả lời đề cập đến một bài báo trên SitePoint không hoàn toàn đầy đủ. Vui lòng xem RFC 6265 (công bằng mà nói, RFC này được phát hành vào năm 2011 sau khi câu hỏi này được đăng, thay thế RFC 2965 trước đó từ năm 2000 và RFC 2109 từ năm 1997).
Phần 5.4 , tiểu mục 2 có điều này để nói:
Tác nhân người dùng NÊN sắp xếp danh sách cookie theo thứ tự sau:
- Cookie có đường dẫn dài hơn được liệt kê trước cookie có đường dẫn ngắn hơn.
LƯU Ý: Không phải tất cả các tác nhân người dùng đều sắp xếp danh sách cookie theo thứ tự này, nhưng thứ tự này phản ánh thông lệ phổ biến khi tài liệu này được viết, và trong lịch sử, đã có những máy chủ (sai) phụ thuộc vào thứ tự này.
Ngoài ra còn có viên ngọc nhỏ này trong phần 4.2.2 :
... máy chủ KHÔNG NÊN dựa vào thứ tự tuần tự hóa. Đặc biệt, nếu tiêu đề Cookie chứa hai cookie có cùng tên (ví dụ: được đặt với các thuộc tính Đường dẫn hoặc Miền khác nhau), máy chủ KHÔNG NÊN dựa vào thứ tự mà các cookie này xuất hiện trong tiêu đề.
Trong cookie yêu cầu mẫu của bạn ( Cookie: a = 2; a = 1 ) lưu ý rằng cookie được đặt với đường dẫn / example ( a = 2 ) có đường dẫn dài hơn so với cookie có đường dẫn / ( a = 1 ) và do đó được gửi lại cho bạn trong dòng đầu tiên, phù hợp với khuyến nghị của thông số kỹ thuật. Vì vậy, bạn ít nhiều đúng khi cho rằng bạn có thể chọn giá trị đầu tiên.
Thật không may, ngôn ngữ được sử dụng trong RFC cực kỳ cụ thể - việc sử dụng các từ NÊN và KHÔNG NÊN gây ra sự mơ hồ trong RFC. Những điều này chỉ ra các quy ước cần được tuân theo, nhưng không bắt buộc phải tuân theo thông số kỹ thuật. Mặc dù tôi hiểu khá rõ về RFC cho vấn đề này, nhưng tôi vẫn chưa thực hiện nghiên cứu để xem khách hàng trong thế giới thực làm gì; có thể một hoặc nhiều trình duyệt hoặc phần mềm khác hoạt động như máy khách HTTP có thể không gửi cookie đường dẫn dài nhất (ví dụ: / example ) đầu tiên trong tiêu đề Cookie:.
Nếu bạn có quyền kiểm soát giá trị của cookie và bạn muốn làm cho giải pháp của mình trở nên dễ hiểu, tốt nhất bạn nên:
sử dụng tên cookie khác để ghi đè trong các đường dẫn nhất định, chẳng hạn như:
- Set-cookie: a-global = 1; Path = /; Version = 1
- Set-cookie: a-example = 2; Đường dẫn = / example; Phiên bản = 1
lưu trữ đường dẫn bạn cần trong chính giá trị cookie:
- Set-cookie: a = 1 & path = /; Path = /; Phiên bản = 1
- Set-cookie: a = 2 & path = / example; Path = / example; Phiên bản = 1
Cả hai cách giải quyết này đều yêu cầu logic bổ sung trên máy chủ để chọn giá trị cookie mong muốn, bằng cách so sánh URL được yêu cầu với danh sách cookie có sẵn. Nó không quá đẹp. Thật không may RFC không có tầm nhìn xa để yêu cầu một con đường còn hoàn toàn ghi đè một cookie với một con đường ngắn hơn (ví dụ: trong ví dụ của bạn, bạn sẽ nhận được a = 2: Cookie chỉ ).