Некоторые из наших пользователей просили нас включить данные, относящиеся к их учетной записи, в заголовки HTTP запросов, которые мы им отправляем, или даже ответы, которые они получают от нашего API. Каково общее соглашение для добавления пользовательских заголовков HTTP, с точки зрения именования , формата ... и т. Д.
Кроме того, не стесняйтесь публиковать любые умные их использования, которые вы наткнулись в Интернете; Мы пытаемся реализовать это, используя то, что лучше всего в качестве цели :)
http
http-headers
Жюльен Дженесту
источник
источник
Ответы:
Эта рекомендация
будетбыла начать свое имя с «Х-». НапримерX-Forwarded-For
,X-Requested-With
. Это также упоминается в разделе 5 RFC 2047 .Обновление 1 : в июне 2011 года был опубликован первый черновик IETF, чтобы отказаться от рекомендации использовать префикс «X-» для нестандартных заголовков. Причина в том, что, когда нестандартные заголовки с префиксом «X-» становятся стандартными, удаление префикса «X-» нарушает обратную совместимость, заставляя прикладные протоколы поддерживать оба имени (например,
x-gzip
&gzip
теперь эквивалентны). Итак, официальная рекомендация - просто назвать их разумно без префикса «X-».Обновление 2 : в июне 2012 года рекомендация об использовании префикса «X-» стала официальной как RFC 6648 . Ниже приведены ссылки на актуальность:
Обратите внимание, что «НЕ ДОЛЖНО» («не рекомендуется») не то же самое, что «НЕ ДОЛЖНО» («запрещено»), см. Также RFC 2119 для другой спецификации по этим ключевым словам. Другими словами, вы можете продолжать использовать заголовки с префиксом «X-», но это официально больше не рекомендуется, и вы можете определенно не документировать их, как если бы они были общедоступными стандартами.
Резюме :
источник
if (header == "x-gzip")
вif (header == "x-gzip" || header == "gzip")
. Что касается вашей аналогии, вот другая: это похоже на то, как военные говорят: «О, это сложно сменить кого-то с рядового на генерала. Итак, теперь вы все генералы. Теперь нам не нужно делать так много работы»X-
префикс. Я против этого, но продолжай и сделай это. Для заголовков OTOH, не бросайте это. Это позволяет легко смотреть и говорить: «О, это нестандартно; я могу проигнорировать это», поскольку есть те нестандартныеX-
заголовки, а затем есть тот, который я не узнаю; могу ли я проигнорировать это безопасно? »X-
чтобы не допустить столкновения с общедоступными заголовками (благодаря RFC6648, который имеет дело с общедоступными заголовками), и дополнительно определенно используйте произвольный частный префикс. Для публичных заголовков не используйтеX-
ни при каких обстоятельствах.Вопрос стоит перечитать. Заданный вопрос не похож на префиксы поставщиков в свойствах CSS, где уместно ориентироваться на будущее и думать о поддержке поставщиков и официальных стандартах. Фактический вопрос больше похож на выбор имен параметров запроса URL. Никого не должно волновать, кто они. Но использование именных интервалов является вполне допустимым - и распространенным, и правильным - делом.
Обоснование.
Речь идет о соглашениях разработчиков в отношении пользовательских заголовков для конкретных приложений - « данных, относящихся к их учетной записи », - которые не имеют ничего общего с поставщиками, органами стандартизации или протоколами, которые должны быть реализованы третьими сторонами, за исключением того, что разработчик просто нужно избегать имен заголовков, которые могут использоваться другими серверами, прокси или клиентами. По этой причине приведенные примеры «X-Gzip / Gzip» и «X-Forwarded-For / Forwarded-For» являются спорными. Поставленный вопрос касается соглашений в контексте частного API, схожего с соглашениями об именах параметров запроса URL. Это вопрос предпочтения и расстояния между именами; опасения по поводу того, что «X-ClientDataFoo» поддерживается любым прокси или поставщиком без «X»
В префиксе «X-» нет ничего особенного или волшебного, но это помогает прояснить, что это пользовательский заголовок. Фактически, RFC-6648 и др. Помогают подкрепить аргументы в пользу использования префикса «X-», потому что - поскольку производители HTTP-клиентов и серверов отказываются от префикса, - это зависит от вашего приложения, частного API, личных данных. Механизм передачи становится еще лучше изолированным от столкновений пространства имен с небольшим количеством официальных зарезервированных имен заголовков. Тем не менее, мое личное предпочтение и рекомендация - пойти дальше и сделать, например, «X-ACME-ClientDataFoo» (если ваша компания по производству виджетов - «ACME»).
ИМХО спецификация IETF недостаточно конкретна, чтобы ответить на вопрос OP, потому что она не может различить совершенно разные варианты использования: (A) поставщики вводят новые глобально применимые функции, такие как «Forwarded-For», с одной стороны, против (B) разработчики приложений передают специфичные для приложения строки клиенту и серверу. Спецификация касается только первого, (A). Вопрос здесь заключается в том, существуют ли соглашения для (B). Есть. Они включают в себя группировку параметров в алфавитном порядке и отделение их от множества соответствующих стандартам заголовков типа (A). Использование префикса «X-» или «X-ACME-» удобно и допустимо для (B) и не конфликтует с (A). Чем больше вендоров прекратят использовать «X-» для (A), тем более отчетливыми станут (B).
Пример:
Google (который имеет небольшой вес в различных органах стандартизации) - по состоянию на сегодня, 20141102 в этом небольшом редактировании моего ответа - в настоящее время использует «X-Mod-Pagespeed», чтобы указать версию своего модуля Apache участвует в преобразовании данного ответа. Кто-нибудь действительно предлагает, чтобы Google использовал «Mod-Pagespeed» без «X-» и / или попросил IETF благословить его использование?
Сводка:
если вы используете пользовательские заголовки HTTP (в качестве иногда подходящей альтернативы файлам cookie) в своем приложении для передачи данных на сервер или с него, и эти заголовки явно НЕ предназначены для использования вне контекста вашего применение, интервал имен с префиксом «X-» или «X-FOO-» является разумным и распространенным соглашением.
источник
Формат заголовков HTTP определен в спецификации HTTP. Я собираюсь поговорить о HTTP 1.1, для которого спецификация RFC 2616 . В разделе 4.2 «Заголовки сообщений» определена общая структура заголовка:
Это определение опирается на два основных столпа, токен и текст. Оба они определены в разделе 2.2 «Основные правила». Токен это:
В свою очередь опираясь на CHAR, CTL и разделители:
ТЕКСТ это:
Где LWS - линейный пробел, определение которого я не буду воспроизводить, а OCTET:
Есть примечание, сопровождающее определение:
Итак, два вывода. Во-первых, ясно, что имя заголовка должно состоять из подмножества символов ASCII - буквенно-цифровых символов, некоторой пунктуации, а не чего-то еще. Во- вторых, нет ничего в определении заголовка значения , что накладывает ограничения на это в ASCII или исключает 8-битных символов: это явно состоит из октетов, с символами только управления перемычкой (обратите внимание , что CR и LF рассматриваются элементы управления). Кроме того, комментарий к продукции TEXT подразумевает, что октеты должны интерпретироваться как находящиеся в ISO-8859-1, и что существует механизм кодирования (который, кстати, ужасен) для представления символов вне этой кодировки.
Итак, для ответа на @BalusC, в частности, совершенно ясно, что согласно спецификации значения заголовков приведены в ISO-8859-1. Я отправил символы высокого уровня 8859-1 (в частности, некоторые ударные гласные, как они используются на французском языке) в заголовке из Tomcat, и правильно интерпретировал их Firefox, так что в некоторой степени это работает на практике так же, как и в теории (хотя это был заголовок Location, который содержит URL, и эти символы недопустимы в URL, так что это было фактически недопустимо, но по другому правилу!).
Тем не менее, я бы не стал полагаться на ISO-8859-1, работающий на всех серверах, прокси-серверах и клиентах, поэтому я бы придерживался ASCII в качестве защитного программирования.
источник
RFC6648 рекомендует, чтобы вы предположили, что ваш пользовательский заголовок "может стать стандартизированным, общедоступным, широко развернутым или использоваться в нескольких реализациях". Поэтому он рекомендует не ставить перед ним префикс «X-» или аналогичные конструкции.
Однако есть исключение «когда крайне маловероятно, что [ваш заголовок] когда-либо будет стандартизирован». Для таких заголовков «для конкретной реализации и частного использования» RFC говорит, что пространство имен, такое как префикс поставщика, является оправданным.
источник
X-
префикс, поскольку более вероятно, что что-то без какого-либо префикса может стать стандартизированным.X-
, но это предположение отличается от того, которое в первую очередь принимает RFC6648. Исключение RFC учитывает потенциальные конфликты между будущим стандартным заголовком и заголовком другого поставщика, чья технология может стать интегрированной с вашей в результате слияния компаний и т. Д. Именно поэтому исключение требует использования префикса поставщика.Изменение или, вернее, добавление дополнительных заголовков HTTP - отличный инструмент для отладки кода, если ничего больше.
Когда запрос URL-адреса возвращает перенаправление или изображение, отсутствует html-страница для временной записи результатов кода отладки - по крайней мере, не той, которая видна в браузере.
Один из подходов - записать данные в локальный файл журнала и просмотреть его позже. Другой способ - временно добавить заголовки HTTP, отражающие отлаживаемые данные и переменные.
Я регулярно добавляю дополнительные заголовки HTTP, такие как X-fubar-somevar: или X-testing-someresult: чтобы проверить это, - и обнаружил множество ошибок, которые иначе было бы очень трудно отследить.
источник
Реестр имен полей заголовков определен в RFC3864 , и ничего особенного в «X-» нет.
Насколько я могу судить, нет никаких указаний для частных заголовков; сомневайся, избегай их. Или взгляните на HTTP Extension Framework ( RFC 2774 ).
Было бы интересно понять больше варианта использования; почему нельзя добавить информацию в тело сообщения?
источник