Własne nagłówki HTTP: konwencje nazewnictwa

Kilku naszych użytkowników poprosiło nas o umieszczenie danych dotyczących ich konta w nagłówkach HTTP zapytań, które im wysyłamy, a nawet odpowiedzi, które otrzymują z naszego API. Jaka jest ogólna konwencja dodawania niestandardowych nagłówków HTTP, pod względem nazewnictwa , format ... itd.

Również, nie krępuj się publikować wszelkie inteligentne wykorzystanie tych, które natknąłeś się na sieci; staramy się wdrożyć to, wykorzystując to, co najlepsze na rynku jako cel:) {]}

Author: Julien Genestoux, 2010-08-25

6 answers

W czerwcu 2012 roku, rezygnacja z rekomendacji używania prefiksu "X-" stała się oficjalna jako RFC 6648 . Poniżej znajdują się cytaty o znaczeniu:

3. Zalecenia dla twórców nowych parametrów

...

  1. nie powinny poprzedzać nazw swoich parametrów "X -" lub podobnym konstrukcje.

4. Zalecenia dla projektantów protokołów

...

  1. Nie powinno zabronić parametry z przedrostkiem "X -" lub podobnym konstrukcje z rejestracji.

  2. Nie może przewidywać, że parametr z przedrostkiem "X -" lub podobne konstrukcje należy rozumieć jako niestandardowe.

  3. Nie może przewidywać, że parametr bez przedrostka "X -" lub podobne konstrukcje należy rozumieć jako standaryzowane.

Zauważ, że "SHOULD NOT" ("zniechęcony") nie jest tym samym co" MUST NOT "("zakazany"), Zobacz także RFC 2119 dla innej specyfikacji tych słów kluczowych. Innymi słowy, możesz nadal używać nagłówków z prefiksem" X -", ale nie jest to zalecane i możesz nie dokumentować ich tak, jakby były standardem publicznym.


W czerwcu 2011 roku, pierwszyprojekt IETF został opublikowany dodeprecate zalecenie używania prefiksu "X-" dla niestandardowych nagłówków. Powodem jest to, że gdy niestandardowe nagłówki z prefiksem "X -" stają się standardem, usuwając przerwy przedrostka " X -" kompatybilność wsteczna, zmuszając protokoły aplikacji do obsługi obu nazw (np., x-gzip & gzip są obecnie równoważne). Zaleca się więc po prostu nazwać je rozsądnie bez przedrostka " X -".


Zalecenie jest było , Aby rozpocząć ich nazwę od " X -". E. g. X-Forwarded-For, X-Requested-With. Jest to również wspomniane w a.o. sekcja 5 RFC 2047.

 972
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-10 14:57:40

Pytanie brzmi ponownie. Zadawane pytanie nie jest podobne do prefiksów dostawcy we właściwościach CSS, gdzie odpowiednie jest przyszłościowe sprawdzanie i myślenie o wsparciu dostawcy i oficjalnych standardach. Zadawane pytanie jest bardziej podobne do wyboru nazw parametrów zapytania URL. Nikogo nie powinno obchodzić to, czym są. Ale rozstaw nazw Na niestandardowych jest całkowicie poprawny - i powszechny , i poprawny-rzecz do zrobienia.

Uzasadnienie:
Chodzi o konwencje wśród Programiści dla niestandardowych nagłówków specyficznych dla aplikacji -- "dane związane z ich kontem " - które nie mają nic wspólnego z dostawcami, organami normalizacyjnymi lub protokołami, które mają być implementowane przez strony trzecie, z wyjątkiem tego, że dany deweloper musi po prostu unikać nazw nagłówków, które mogą mieć inne zamierzone użycie przez serwery, proxy lub klientów. Z tego powodu podane przykłady "X-Gzip/Gzip" i "X-Forwarded-For/Forwarded-For" są dyskusyjne. Postawione pytanie dotyczy konwencji w kontekst prywatnego API, podobny do konwencji nazewnictwa parametrów zapytań URL. Jest to kwestia preferencji i odstępów między nazwami; obawy o to, że "X-ClientDataFoo" jest obsługiwany przez dowolny serwer proxy lub dostawcę bez "X" są wyraźnie zagubione.

Nie ma nic specjalnego ani magicznego w przedrostku "X -", ale pomaga to wyjaśnić, że jest to niestandardowy nagłówek. W rzeczywistości, RFC-6648 i inni pomagają wzmocnić sprawę użycia prefiksu " X -", ponieważ -- jako dostawcy klientów i serwerów HTTP rezygnują z prefix - specyficzny dla Twojej aplikacji, prywatny-API, mechanizm przekazywania danych osobowych staje się jeszcze lepszy-izolowany przed kolizjami przestrzeni nazw z niewielką liczbą oficjalnych zastrzeżonych nazw nagłówków. To powiedziawszy, moje osobiste preferencje i zalecenie jest iść o krok dalej i zrobić np. "X-ACME-ClientDataFoo" (jeśli Twoja firma widget jest "ACME").

IMHO Specyfikacja IETF jest niewystarczająco dokładna, aby odpowiedzieć na pytanie OP, ponieważ nie rozróżnia zupełnie innego zastosowania przypadki: (a) dostawcy wprowadzający nowe globalne funkcje, takie jak "Forwarded-For" z jednej strony, VS. (B) twórcy aplikacji przekazujący specyficzne dla aplikacji ciągi do/Z klienta i serwera. Spec dotyczy tylko pierwszego, (A). Pytanie, Czy istnieją konwencje dla (B). Są. Obejmują one grupowanie parametrów Alfabetycznie i oddzielanie ich od wielu nagłówków istotnych dla standardów typu (A). Używanie przedrostka "X -" lub "X-ACME -" jest wygodne i uprawniony do (B) i nie koliduje z (A). Im więcej sprzedawców przestaje używać "X -" Dla (A), tym bardziej wyraźne będą (B).

Przykład:
Google (które mają trochę wagi w różnych organach standardów) są-na dzień dzisiejszy, 20141102 w tej drobnej edycji mojej odpowiedzi-obecnie używa "X-Mod-Pagespeed", aby wskazać wersję swojego modułu Apache zaangażowanego w przekształcanie danej odpowiedzi. Czy ktoś naprawdę sugeruje, że Google powinno używać "Mod-Pagespeed", bez" X - " i / lub poprosić IETF o pobłogosławienie jego użycia?

Podsumowanie:
Jeśli używasz niestandardowych nagłówków HTTP (jako czasami odpowiednia alternatywa dla plików cookie) w swojej aplikacji do przekazywania danych do/z serwera, a nagłówki te nie są wyraźnie przeznaczone do użycia poza kontekstem aplikacji, umieszczenie ich w nazwach za pomocą prefiksu "X-" lub "X-FOO-" jest rozsądną i powszechną konwencją.

 424
Author: cweekly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 08:36:58

Format nagłówków HTTP jest zdefiniowany w specyfikacji HTTP. Będę mówił o HTTP 1.1, dla którego Specyfikacja to RFC 2616 . W sekcji 4.2 "nagłówki wiadomości" zdefiniowano ogólną strukturę nagłówka:

   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>

Definicja ta opiera się na dwóch głównych filarach: tokenie i tekst. Oba są zdefiniowane w sekcji 2.2, "Podstawowe zasady". Token to:

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

Z kolei na CHAR, CTL i separatorach:

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

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

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

Tekst jest:

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

Gdzie LWS jest liniowa przestrzeń Biała, której definicji nie odtworzę, a oktet to:

   OCTET          = <any 8-bit sequence of data>

Do definicji dołączona jest uwaga:

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].
Dwa wnioski. Po pierwsze, jest jasne, że nagłówek Nazwa {[22] } musi składać się z podzbioru znaków ASCII - alfanumerycznych, interpunkcyjnych, niewiele więcej. Po drugie, w definicji nagłówka wartość nie ma nic, co ograniczałoby go do ASCII lub wykluczałoby 8-bitowe znaki: jest on wyraźnie złożony z oktetów, z blokadą tylko znaków sterujących (należy pamiętać, że CR i LF są uważane za kontrolki). Co więcej, komentarz do produkcji tekstu sugeruje, że oktety należy interpretować jako będące w ISO-8859-1 i że istnieje mechanizm kodowania (który jest okropny, nawiasem mówiąc) do reprezentowania znaków poza tym kodowaniem.

Więc, aby odpowiedzieć na @BalusC w szczególności, jest całkiem jasne, że zgodnie ze specyfikacją, wartości nagłówka są w ISO-8859-1. Wysłałem wysokie-8859-1 znaków (w szczególności niektóre akcentowane samogłoski używane w języku francuskim) w nagłówku z Tomcat, i miał je poprawnie zinterpretowane przez Firefoksa, więc do pewnego stopnia, to działa w praktyce ,jak również w teorii (chociaż był to nagłówek lokalizacji, który zawiera adres URL, a te znaki nie są legalne w adresach URL, więc to było faktycznie nielegalne, ale pod inną zasadą!).

To powiedziawszy, nie polegałbym na ISO-8859-1 działającym na wszystkich serwerach, serwerach proxy i klientach, więc trzymałbym się ASCII programowanie obronne.

 56
Author: Tom Anderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 19:49:17

Rejestr nazw pól nagłówka jest zdefiniowany w RFC3864 i nie ma nic specjalnego z "X -".

Z tego, co wiem, nie ma wytycznych dla prywatnych nagłówków; w wątpliwość, unikaj ich. Lub spójrz na http Extension Framework (RFC 2774).

Byłoby interesujące, aby zrozumieć więcej przypadków użycia; dlaczego nie można dodać informacji do treści wiadomości?

 14
Author: Julian Reschke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-25 07:33:56

Modyfikowanie, lub bardziej poprawnie, Dodawanie dodatkowych nagłówków HTTP jest świetnym narzędziem do debugowania kodu, jeśli nic innego.

Gdy żądanie adresu URL zwraca przekierowanie lub obraz, nie ma "strony" html, na której można tymczasowo zapisać wyniki kodu debugowania - przynajmniej takiej, która jest widoczna w przeglądarce.

Jednym z sposobów jest zapisanie danych do lokalnego pliku dziennika i wyświetlenie tego pliku później. Innym jest tymczasowe dodawanie nagłówków HTTP odzwierciedlających Dane i zmienne będące debugowany.

Regularnie dodaję dodatkowe nagłówki HTTP, takie jak X-FUBAR-somevar: lub X-testing-someresult : aby przetestować rzeczy - i znalazłem wiele błędów, które w przeciwnym razie byłyby bardzo trudne do wyśledzenia.

 14
Author: g1smd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-04 09:29:21

RFC6648 zaleca założenie, że niestandardowy nagłówek " może stać się ustandaryzowany ,publiczny, powszechnie wdrożony lub użyteczny w wielu implementacjach."Dlatego zaleca, aby nie poprzedzać go przedrostkiem "X -" lub podobnymi konstrukcjami.

Istnieje jednak wyjątek", gdy jest bardzo mało prawdopodobne, że [Twój nagłówek] zostanie kiedykolwiek ustandaryzowany."Dla takich nagłówków" implementation-specific and private-use", RFC mówi, że przestrzeń nazw, taka jak przedrostek vendor, jest uzasadniona.

 3
Author: Edward Brey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-24 13:50:45