Tiêu đề HTTP tùy chỉnh: quy ước đặt tên


1114

Một số người dùng của chúng tôi đã yêu cầu chúng tôi đưa dữ liệu liên quan đến tài khoản của họ vào tiêu đề HTTP của các yêu cầu chúng tôi gửi cho họ hoặc thậm chí các phản hồi họ nhận được từ API của chúng tôi. Quy ước chung để thêm các tiêu đề HTTP tùy chỉnh là gì, về cách đặt tên , định dạng ... vv

Ngoài ra, vui lòng đăng bất kỳ cách sử dụng thông minh nào trong số này mà bạn tình cờ thấy trên web; Chúng tôi đang cố gắng thực hiện điều này bằng cách sử dụng những gì tốt nhất ngoài mục tiêu :)


25
Xin lưu ý rằng tường lửa có thể loại bỏ các trường tiêu đề phản hồi. Một số loại bỏ mọi thứ không được đề cập trong RFC 2616 (tháng 6 năm 1999, HTTP 1.1). Phía khách hàng vẫn có thể sử dụng được mà không cần các trường mới.
stesch

5
Lưu ý rằng những nhận xét của @stesch không áp dụng khi sử dụng HTTP S .
code_dredd

1
Lưu ý rằng nhận xét của @code_dredd là một truyền thuyết đô thị. Tường lửa có thể lọc nội dung HTTPS. Xem howtoforge.com/filtering-https-traffic-with-squidwatchguard.com/help/docs/wsm/xtm_11/en-us/content/en-us/...
stesch

@stesch Cho rằng về cơ bản bài viết của bạn biến proxy thành một thứ tương tự như MiTM (nó lấy kết nối máy khách được mã hóa và sau đó tạo một cái mới), thì chắc chắn, bạn có thể làm hầu hết mọi thứ, nhưng thực tế đó phủ nhận mã hóa từ PoV của proxy b / c đó là giải mã chính nội dung của khách hàng. Trong trường hợp đó, từ PoV của proxy, về cơ bản như thể bạn không sử dụng HTTPS ở vị trí số 1 ...
code_dredd

Câu trả lời:


1171

Các khuyến nghị được để bắt đầu tên của họ với "X". Ví dụ X-Forwarded-For, X-Requested-With. Điều này cũng được đề cập trong phần 5 của RFC 2047 .


Cập nhật 1 : Vào tháng 6 năm 2011, dự thảo IETF đầu tiên đã được đăng để phản đối khuyến nghị sử dụng tiền tố "X-" cho các tiêu đề không chuẩn. Lý do là khi các tiêu đề không chuẩn có tiền tố "X-" trở thành tiêu chuẩn, loại bỏ tiền tố "X-" sẽ phá vỡ tính tương thích ngược, buộc các giao thức ứng dụng phải hỗ trợ cả hai tên (Ví dụ, x-gzip& gziphiện tương đương). Vì vậy, khuyến nghị chính thức là chỉ cần đặt tên cho chúng một cách hợp lý mà không cần tiền tố "X-".


Cập nhật 2 : Vào tháng 6 năm 2012, việc không khuyến nghị sử dụng tiền tố "X-" đã trở thành chính thức như RFC 6648 . Dưới đây là trích dẫn liên quan:

3. Khuyến nghị cho người tạo thông số mới

...

  1. KHÔNG NÊN tiền tố tên tham số của họ với "X-" hoặc các cấu trúc tương tự.

4. Khuyến nghị cho các nhà thiết kế giao thức

...

  1. KHÔNG NÊN cấm các tham số có tiền tố "X-" hoặc các cấu trúc tương tự được đăng ký.

  2. PHẢI KHÔNG quy định rằng một tham số có tiền tố "X-" hoặc các cấu trúc tương tự cần được hiểu là không đạt tiêu chuẩn.

  3. PHẢI KHÔNG quy định rằng một tham số không có tiền tố "X-" hoặc các cấu trúc tương tự cần được hiểu là tiêu chuẩn hóa.

Lưu ý rằng "KHÔNG NÊN" ("không khuyến khích") không giống như "PHẢI KHÔNG" ("cấm"), xem thêm RFC 2119 để biết thông số kỹ thuật khác về các từ khóa đó. Nói cách khác, bạn có thể tiếp tục sử dụng các tiêu đề có tiền tố "X-", nhưng nó không được đề xuất chính thức nữa và bạn chắc chắn không thể ghi lại chúng như thể chúng là tiêu chuẩn chung.


Tóm tắt :

  • khuyến nghị chính thức là chỉ đặt tên cho chúng hợp lý mà không cần tiền tố "X-"
  • bạn có thể tiếp tục sử dụng các tiêu đề có tiền tố "X-", nhưng nó không được đề xuất chính thức nữa và bạn chắc chắn không thể ghi lại chúng như thể chúng là tiêu chuẩn chung

306
Giống như có nhiều trẻ em sẽ không bao giờ kết thúc như các vận động viên chuyên nghiệp, nhiều tiêu đề tùy chỉnh sẽ không bao giờ kết thúc như là tiêu chuẩn. Tôi có xu hướng giữ "X-" trên những cái đó.
G-Mac

19
@ G-Mac Đồng ý. Có rất nhiều tiêu đề tùy chỉnh sẽ không bao giờ kết thúc tiêu chuẩn hóa. Vài mà làm, thật dễ dàng để chỉ chỉnh sửa mã của bạn từ if (header == "x-gzip")đến if (header == "x-gzip" || header == "gzip"). Đối với sự tương tự của bạn, đây là một ví dụ khác: giống như quân đội nói "Ồ, thật khó để thay đổi ai đó từ Riêng tư thành Tướng quân. Vì vậy, từ giờ trở đi, tất cả các bạn đều là Tướng quân. Bây giờ chúng ta không cần phải làm quá nhiều việc"
Cole Johnson

24
@ColeJohnson Không chắc chắn nếu sự tương tự đó hoạt động. Vấn đề ở đây là không có điểm trung tâm nào bạn có thể thay đổi tên. Mỗi đoạn mã dự kiến ​​x-gzip bây giờ phải được thay đổi hoặc tiêu đề cũ cần tiếp tục được sử dụng cùng với mã mới. Nên đi với RFC 6648.
vinod

4
@Vinod vâng. Điều này có ý nghĩa, nhưng có rất nhiều tiêu chuẩn được đề xuất sẽ không bao giờ nhìn thấy ánh sáng trong ngày. Đối với các loại tệp, chắc chắn; bỏ X-tiền tố. Tôi chống lại nó, nhưng hãy tiếp tục và làm điều đó. Đối với các tiêu đề OTOH, đừng bỏ nó. Nó giúp bạn dễ dàng nhìn và đi, "ồ, nó không chuẩn; tôi có thể bỏ qua nó" vs "có những tiêu X-đề không chuẩn đó , và sau đó có cái này tôi không nhận ra; tôi có thể bỏ qua nó một cách an toàn không?"
Cole Johnson

21
Mặc dù giọng điệu của câu trả lời của cweekly là phòng thủ không cần thiết, tôi tin rằng anh ấy đúng, và quan điểm của anh ấy giải quyết vấn đề được minh họa trong chủ đề bình luận này. Nói tóm lại, đừng cố xác định xem một tiêu đề sẽ "tốt nghiệp" hay không; thay vào đó xác định xem đó là tiêu đề riêng tư hay công khai (dành riêng cho ứng dụng hoặc "chung chung" / "toàn cầu"). Đối với các tiêu đề riêng, tùy chọn sử dụng X-để đảm bảo không có xung đột với các tiêu đề công khai (nhờ RFC6648, liên quan đến các tiêu đề công khai) và ngoài ra, chắc chắn sử dụng tiền tố riêng tùy ý. Đối với các tiêu đề công khai, không sử dụng X-trong bất kỳ trường hợp nào.
tne

535

Câu hỏi gấu đọc lại. Câu hỏi thực tế được hỏi không giống với tiền tố của nhà cung cấp trong các thuộc tính CSS, trong đó việc chứng minh và suy nghĩ trong tương lai về hỗ trợ của nhà cung cấp và các tiêu chuẩn chính thức là phù hợp. Câu hỏi thực tế được hỏi gần giống với việc chọn tên tham số truy vấn URL. Không ai nên quan tâm họ là gì. Nhưng khoảng cách tên các tùy chỉnh là một điều hoàn toàn hợp lệ - và phổ biến, và chính xác - điều cần làm.

Đặt vấn đề:
Đó là về các quy ước giữa các nhà phát triển cho các tiêu đề tùy chỉnh, dành riêng cho ứng dụng - " dữ liệu liên quan đến tài khoản của họ " - không liên quan gì đến các nhà cung cấp, cơ quan tiêu chuẩn hoặc giao thức được thực hiện bởi các bên thứ ba, ngoại trừ nhà phát triển trong câu hỏi chỉ cần tránh các tên tiêu đề có thể có mục đích sử dụng khác của máy chủ, proxy hoặc máy khách. Vì lý do này, các ví dụ "X-Gzip / Gzip" và "X-Forwarded-For / Forwarded-For" được đưa ra là moot. Câu hỏi được đặt ra là về các quy ước trong ngữ cảnh của API riêng, gần giống với các quy ước đặt tên tham số truy vấn URL. Đó là vấn đề ưu tiên và khoảng cách tên; lo ngại về "X-ClientDataFoo" được hỗ trợ bởi bất kỳ proxy hoặc nhà cung cấp nào mà không có "X"

Không có gì đặc biệt hay kỳ diệu về tiền tố "X-", nhưng nó giúp làm rõ rằng đó là một tiêu đề tùy chỉnh. Trên thực tế, RFC-6648 và cộng sự giúp củng cố trường hợp sử dụng tiền tố "X-", bởi vì - khi các nhà cung cấp máy khách và máy chủ HTTP từ bỏ tiền tố - API riêng, ứng dụng, dữ liệu cá nhân của bạn cơ chế chuyền đang trở nên thậm chí được cách ly tốt hơn trước các va chạm không gian tên với số lượng nhỏ các tên tiêu đề được bảo lưu chính thức. Điều đó nói rằng, sở thích và đề xuất cá nhân của tôi là tiến thêm một bước và làm ví dụ: "X-ACME-ClientDataFoo" (nếu công ty phụ tùng của bạn là "ACME").

IMHO thông số IETF không đủ cụ thể để trả lời câu hỏi của OP, vì nó không phân biệt được các trường hợp sử dụng hoàn toàn khác nhau: (A) các nhà cung cấp giới thiệu các tính năng mới có thể áp dụng trên toàn cầu như "Chuyển tiếp cho" trên một mặt, so với (B) nhà phát triển ứng dụng chuyển các chuỗi dành riêng cho ứng dụng đến / từ máy khách và máy chủ. Thông số kỹ thuật chỉ liên quan đến chính nó, (A). Câu hỏi ở đây là liệu có các quy ước cho (B) không. Có. Chúng liên quan đến việc nhóm các tham số lại với nhau theo thứ tự bảng chữ cái và tách chúng ra khỏi nhiều tiêu đề liên quan đến tiêu chuẩn loại (A). Sử dụng tiền tố "X-" hoặc "X-ACME-" là thuận tiện và hợp pháp cho (B) và không xung đột với (A). Càng nhiều nhà cung cấp ngừng sử dụng "X-" cho (A), các nhà cung cấp (B) sẽ càng rõ ràng hơn.

Ví dụ:
Google (người mang một chút trọng lượng trong các cơ quan tiêu chuẩn khác nhau) - tính đến ngày hôm nay, 20141102 trong bản chỉnh sửa nhỏ này cho câu trả lời của tôi - hiện đang sử dụng "X-Mod-Pagespeed" để chỉ ra phiên bản mô-đun Apache của họ tham gia vào việc chuyển đổi một phản ứng nhất định. Có ai thực sự đề xuất rằng Google nên sử dụng "Mod-Pagespeed", mà không có "X-" và / hoặc yêu cầu IETF ban phước cho việc sử dụng nó không?

Tóm tắt:
Nếu bạn đang sử dụng Tiêu đề HTTP tùy chỉnh (như một cách thay thế phù hợp với cookie) trong ứng dụng của bạn để truyền dữ liệu đến / từ máy chủ của bạn và những tiêu đề này rõ ràng KHÔNG được sử dụng ngoài ngữ cảnh của bạn ứng dụng, đặt tên cho chúng với tiền tố "X-" hoặc "X-FOO-" là một quy ước hợp lý và phổ biến.


52
Tôi sẽ đánh giá cao nếu bất kỳ ý kiến ​​phản đối nào của tôi có thể giải thích phần nào trong câu trả lời của tôi mà họ thấy phản cảm. Tôi không quan tâm lắm đến điểm danh tiếng của mình, nhưng tôi thực sự tò mò. Trường hợp bất đồng nằm ở đâu? Cảm ơn.
vào

56
Tôi hoàn toàn đồng ý với câu trả lời của bạn và đó là câu trả lời duy nhất ở đây trả lời câu hỏi thực tế. Chúng ta đang nói về các tiêu đề tùy chỉnh, dành riêng cho ứng dụng ở đây, không bao giờ được tiêu chuẩn hóa trong các tiêu chuẩn HTTP. Có một quy ước chung cho những người mà mọi người có xu hướng sử dụng? (chẳng hạn như tiền tố chúng với "_" có lẽ? tức là: ("_ClientDataFoo")
Marchy

14
Cảm ơn Marchy, yeah, câu trả lời được chấp nhận không giải quyết câu hỏi được hỏi. IETF không dùng tiền tố "X-" cho các tiêu đề không chuẩn (nhưng chung chung) không liên quan đến các tiêu đề dành riêng cho ứng dụng tùy chỉnh sẽ không bao giờ được tiêu chuẩn hóa. Để trả lời câu hỏi của bạn, theo ý kiến ​​và kinh nghiệm của tôi (16 năm webdev), quy ước tốt nhất là sử dụng "X-ACME-ClientData" đã nói ở trên. "X-" bc nó không phải là tiêu chuẩn (cũng sẽ không bao giờ, đó là lý do tại sao sự phản đối của IETF ở đây), "ACME-" để đặt tên cho công ty "ACME" hoặc ứng dụng cụ thể của bạn và "ClientData" có thể là bất cứ điều gì tên ngữ nghĩa mà bạn thích. :)
vào

5
@DarrelMiller ... do đó khuyến nghị sử dụng X-ACMECO-WIDGET-FOO. Tôi khẳng định rằng, đối với câu hỏi của OP khi được hỏi, việc sử dụng X- đơn giản là không được chỉ định bởi RFC-6648 và tương tự. Nếu bạn là nhà cung cấp cung cấp khung, thư viện hoặc mô-đun để sử dụng cho các dự án của người khác, thì đó là một câu chuyện khác và bằng mọi cách, hãy theo RFC đó đến T. Nhưng đó chỉ là ứng dụng cho các ứng dụng một lần riêng lẻ, trong đó tùy chỉnh Các quy ước đặt tên tiêu đề dành riêng cho ứng dụng là các API hoàn toàn riêng tư. Làm thế nào họ sẽ đụng độ với tên "của người khác"? Những người đó sẽ là ai?
vào

11
Tôi thực sự có một chút khó khăn để hiểu lý do RFC. Cứ cho rằng, nếu và khi tham số được chuẩn hóa, sẽ có cả phiên bản x- và không x-. Đó chỉ là vấn đề nếu hành vi của phiên bản x- và không x- là giống hệt nhau. Tôi tình cờ thấy ở đây vì tôi đang xem việc thêm tiêu đề "thay mặt" cho API của mình. Nó có thể trở nên công khai một ngày nào đó (vì đây là một trường hợp sử dụng phổ biến). Nếu tôi đã sử dụng "On-Behalf-Of" và một ngày nào đó họ thêm rằng đó là một tiêu đề tiêu chuẩn, tỷ lệ mà ngữ nghĩa của tôi sẽ giống với tiêu chuẩn là gì?
lừa4jesus

62

Định dạng cho các tiêu đề HTTP được xác định trong đặc tả HTTP. Tôi sẽ nói về HTTP 1.1, trong đó đặc tả là RFC 2616 . Trong phần 4.2, 'Tiêu đề thư', cấu trúc chung của tiêu đề được xác định:

   message-header = field-name ":" [ field-value ]
   field-name     = token
   field-value    = *( field-content | LWS )
   field-content  = <the OCTETs making up the field-value
                    and consisting of either *TEXT or combinations
                    of token, separators, and quoted-string>

Định nghĩa này dựa trên hai trụ cột chính, mã thông báo và văn bản. Cả hai đều được định nghĩa trong phần 2.2, 'Quy tắc cơ bản'. Mã thông báo là:

   token          = 1*<any CHAR except CTLs or separators>

Lần lượt nghỉ ngơi trên CHAR, CTL và dải phân cách:

   CHAR           = <any US-ASCII character (octets 0 - 127)>

   CTL            = <any US-ASCII control character
                    (octets 0 - 31) and DEL (127)>

   separators     = "(" | ")" | "<" | ">" | "@"
                  | "," | ";" | ":" | "\" | <">
                  | "/" | "[" | "]" | "?" | "="
                  | "{" | "}" | SP | HT

VĂN BẢN là:

   TEXT           = <any OCTET except CTLs,
                    but including LWS>

Trong đó LWS là không gian trắng tuyến tính, với định nghĩa tôi sẽ không tái tạo và OCTET là:

   OCTET          = <any 8-bit sequence of data>

Có một lưu ý kèm theo định nghĩa:

The TEXT rule is only used for descriptive field contents and values
that are not intended to be interpreted by the message parser. Words
of *TEXT MAY contain characters from character sets other than ISO-
8859-1 [22] only when encoded according to the rules of RFC 2047
[14].

Vì vậy, hai kết luận. Đầu tiên, rõ ràng tên tiêu đề phải được tạo từ một tập hợp các ký tự ASCII - chữ số, một số dấu câu, không phải là nhiều dấu chấm khác. Thứ hai, không có gì trong định nghĩa của giá trị tiêu đề giới hạn nó ở ASCII hoặc loại trừ các ký tự 8 bit: nó bao gồm các octet rõ ràng, chỉ có các ký tự điều khiển bị chặn (lưu ý rằng CR và LF được coi là các điều khiển). Hơn nữa, nhận xét về sản xuất văn bản ngụ ý rằng các octet sẽ được hiểu là trong ISO-8859-1, và có một cơ chế mã hóa (thật kinh khủng, tình cờ) để thể hiện các ký tự bên ngoài mã hóa đó.

Vì vậy, để trả lời @BalusC nói riêng, khá rõ ràng rằng theo đặc điểm kỹ thuật, các giá trị tiêu đề nằm trong ISO-8859-1. Tôi đã gửi các ký tự cao 8859-1 (cụ thể là một số nguyên âm có dấu như được sử dụng bằng tiếng Pháp) trong một tiêu đề ra khỏi Tomcat và do chúng giải thích chính xác bởi Firefox, do đó, ở một mức độ nào đó, nó hoạt động trong thực tế cũng như trên lý thuyết (mặc dù đây là tiêu đề Vị trí, chứa URL và các ký tự này không hợp pháp trong các URL, vì vậy đây thực sự là bất hợp pháp, nhưng theo một quy tắc khác!).

Điều đó nói rằng, tôi sẽ không dựa vào ISO-8859-1 hoạt động trên tất cả các máy chủ, proxy và máy khách, vì vậy tôi sẽ gắn bó với ASCII như một vấn đề về lập trình phòng thủ.


3
Thông số HTTP mới hơn RFC7230 nói "Các trường tiêu đề được xác định mới NÊN giới hạn giá trị trường của chúng ở các octet US-ASCII."
Robert Tupelo-Schneck

23

RFC6648 khuyên bạn nên giả định rằng tiêu đề tùy chỉnh của bạn "có thể trở thành tiêu chuẩn hóa, công khai, thường được triển khai hoặc có thể sử dụng trên nhiều triển khai." Do đó, nó khuyến nghị không nên thêm tiền tố vào "X-" hoặc các cấu trúc tương tự.

Tuy nhiên, có một ngoại lệ "khi rất khó có khả năng [tiêu đề của bạn] sẽ được chuẩn hóa." Đối với các tiêu đề "cụ thể và sử dụng riêng" như vậy, RFC cho biết một không gian tên như tiền tố của nhà cung cấp là hợp lý.


6
"RFC6648 khuyên bạn nên cho rằng tiêu đề tùy chỉnh của bạn 'có thể trở nên tiêu chuẩn hóa, công cộng, thường được triển khai, hoặc có thể sử dụng trên nhiều triển khai' Tôi nghĩ rằng đây đưa ra một lý do để sử dụng. X-Prefix vì nó nhiều khả năng một cái gì đó mà không cần bất kỳ tiền tố có thể trở nên chuẩn hoá.
Konrad

@Konrad Nếu bạn cho rằng tiêu đề tương tự của người khác (không phải tiêu đề của bạn) có thể trở thành tiêu chuẩn, bạn có thể tránh xung đột với X-, nhưng đó là một giả định khác với RFC6648 chủ yếu. Tài khoản ngoại lệ của RFC cho các xung đột tiềm ẩn giữa tiêu đề tiêu chuẩn trong tương lai và tiêu đề từ nhà cung cấp khác có công nghệ có thể được tích hợp với công ty của bạn thông qua sáp nhập công ty, v.v ... Đó là lý do ngoại lệ yêu cầu tiền tố của nhà cung cấp.
Edward Brey

17

Sửa đổi, hoặc chính xác hơn, thêm các tiêu đề HTTP bổ sung là một công cụ gỡ lỗi mã tuyệt vời nếu không có gì khác.

Khi một yêu cầu URL trả về một chuyển hướng hoặc một hình ảnh, không có "trang" html để tạm thời ghi kết quả của mã gỡ lỗi vào - ít nhất là không hiển thị trong trình duyệt.

Một cách tiếp cận là ghi dữ liệu vào tệp nhật ký cục bộ và xem tệp đó sau. Một cách khác là tạm thời thêm các tiêu đề HTTP phản ánh dữ liệu và các biến được gỡ lỗi.

Tôi thường xuyên thêm các tiêu đề HTTP bổ sung như X-fubar-somevar: hoặc X-tests-someresult: để kiểm tra mọi thứ - và đã tìm thấy rất nhiều lỗi có thể rất khó theo dõi.


2
Tại sao anh ta nên sử dụng "tiêu chuẩn" này? Các tiêu đề làm việc như nhau. Ngay cả với tiền tố "WHO_EVER_READS_THIS_IS_DUMB_" ...
Ngày

16

Sổ đăng ký tên trường tiêu đề được xác định trong RFC3864 và không có gì đặc biệt với "X-".

Theo như tôi có thể nói, không có hướng dẫn cho các tiêu đề riêng; nghi ngờ, tránh chúng Hoặc hãy xem Khung mở rộng HTTP ( RFC 2774 ).

Sẽ rất thú vị khi hiểu thêm về trường hợp sử dụng; Tại sao thông tin không thể được thêm vào nội dung thư?


13
Lý do chính tôi đang xem xét một số tiêu đề tùy chỉnh là để tôi có thể đưa ra quyết định định tuyến mà không cần phải phân tích cơ thể ...
Rozwel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.