Существует ли практическое ограничение длины HTTP-заголовка?
-
11-09-2019 - |
Вопрос
У меня есть веб-приложение, которое добавляет контекстную информацию в XMLHttpRequest - запрос объекты, использующие setRequestHeader (Установить запрос) API.Я использую пользовательское имя заголовка (напримерX-Foo) и a JSON структурированная ценность.Это не является частью URL QueryString или тела POST, потому что это метаинформация о запросе.
Существует ли практическое ограничение по размеру значения заголовка?Если мой JSON будет усечен, он станет неразличимым.Меня больше всего беспокоят ограничения в Apache 2, Tomcat 6 и IIS 7.Я поискал в Google по ограничение длины http-заголовка, но многие результаты кажутся устаревшими.Есть несколько соответствующих комментариев в Насколько большой может быть строка пользовательского агента? но не так конкретно, как мне бы хотелось.
Редактировать: Я только что наткнулся на этот похожий вопрос - Максимальное значение для http-заголовка?
Решение
Да, но ограничения настраиваются и зависят от платформы.Например, Кот имеет ограничение по умолчанию в 8 тыс.Я полагаю, что IIS 6, не уверен насчет IIS 7, имеет ограничение в 16 КБ.Я столкнулся с этим при использовании интегрированной проверки подлинности Windows для нескольких веб-сайтов.Оказывается, мой токен безопасности был слишком большим, когда он был закодирован в заголовке.К счастью, они настраиваются.Параметры реестра для IIS можно найти по адресу http://support.microsoft.com/kb/820129.Я полагаю, что ключевыми параметрами для изменения являются MaxFieldLength (для каждого размера заголовка) и MaxRequestBytes (общий размер запроса).
Другие советы
Хотя каждое программное обеспечение веб-сервера имеет некоторые ограничения, существует разница в том, существует ли ограничение для Строка HTTP-запроса плюс поля заголовка или для каждого поля заголовка.
Вот краткое изложение:
Итак, в заключение:Чтобы быть принятым всеми вышеперечисленными веб-серверами, a строка запроса плюс поля заголовка запроса не должны превышать 8190 байт.Это также ограничение для каждого поля заголовка (фактически даже меньше).
Для Apache я нашел это Ограничения сервера для обеспечения безопасности Apache статья, в которой перечислены эти директивы:
# allow up to 100 headers in a request
LimitRequestFields 100
# each header may be up to 8190 bytes long
LimitRequestFieldsize 8190
Для Nginx буферы large_client_header_buffers директива из HttpCoreModule управляет этим:
Самая длинная строка заголовка запроса также должна быть не больше размера одного буфера, в противном случае клиент получит сообщение об ошибке "Неверный запрос" (400).
По умолчанию размер одного буфера равен размеру страницы, в зависимости от платформы это либо 4K, либо 8K
Хотя вы можете настроить сервер, маловероятно, что вы действительно сможете настроить весь процесс с помощью брандмауэров, балансировщиков нагрузки и прокси-серверов.Сохранение небольшого размера заголовка позволяет избежать проблем.
Flash Media Server 4.5 имеет очень короткое ограничение по длине заголовка по умолчанию, что может привести к тому, что сервер просто не будет отвечать, особенно в условиях умеренной загрузки файлов cookie.
В файле Flash Media Server Adaptor.xml,
MaxHeaderLineLength
элемент определяет размер HTTP-заголовка, который может обрабатывать сервер.Значение по умолчанию дляMaxHeaderLineLength
составляет 1024 байта.Некоторые браузеры отправляют заголовок размером более 1024 байт.В этом сценарии Apache отправляет обратно пустой ответ.Чтобы устранить эту проблему, настройтеMaxHeaderLineLength
до 8192.Примечание:По умолчанию предельный размер HTTP-заголовка Apache составляет 8 КБ (8190 байт плюс возврат каретки).
Помещаю это здесь на случай, если ограничение размера заголовка на Flash Media Server коснется кого-то другого.