Ответы:
Нет, HTTP не определяет никаких ограничений. Однако большинство веб-серверов ограничивают размер принимаемых ими заголовков. Например, в Apache ограничение по умолчанию составляет 8 КБ, в IIS - 16 КБ . Сервер вернет 413 Entity Too Large
ошибку, если размер заголовков превысит этот предел.
Смежный вопрос: насколько большой может получить строка агента пользователя?
Как сказано выше в vartec, спецификация HTTP не определяет ограничение, однако многие серверы определяют по умолчанию. Это означает, что, практически говоря, нижний предел составляет 8K . Для большинства серверов это ограничение применяется к сумме строки запроса и ВСЕХ полей заголовка (поэтому держите ваши куки короткими).
Стоит отметить, что nginx по умолчанию использует системный размер страницы, который в большинстве систем составляет 4 КБ. Вы можете проверить с помощью этой крошечной программы:
pagesize.c:
#include <unistd.h>
#include <stdio.h>
int main() {
int pageSize = getpagesize();
printf("Page size on your system = %i bytes\n", pageSize);
return 0;
}
Скомпилируйте и gcc -o pagesize pagesize.c
запустите ./pagesize
. Мой сервер Ubuntu от Linode покорно сообщает мне, что ответ 4k.
LimitRequestLine
и LimitRequestFieldSize
применяется к каждой строке заголовка HTTP в отдельности ... а не к "сумме ..."
HTTP не устанавливает предопределенного ограничения на длину каждого поля заголовка или на длину раздела заголовка в целом, как описано в разделе 2.5. На практике встречаются различные специальные ограничения на длину отдельного поля заголовка, часто в зависимости от конкретной семантики поля.
Значения заголовка HTTP ограничены реализациями сервера. Спецификация Http не ограничивает размер заголовка.
Сервер, который получает поле заголовка запроса или набор полей, размер которых больше, чем он хочет обработать, ДОЛЖЕН ответить соответствующим кодом состояния 4xx (Ошибка клиента). Игнорирование таких полей заголовка увеличило бы уязвимость сервера для запроса атак контрабанды (Раздел 9.5).
Большинство серверов вернут 413 Entity Too Large
или исправят ошибку 4xx, когда это произойдет.
Клиент МОЖЕТ отбросить или усечь полученные поля заголовка, которые больше, чем клиент желает обработать, если семантика поля такова, что отброшенные значения могут быть безопасно проигнорированы без изменения рамок сообщения или семантики ответа.
Неограниченный размер заголовка HTTP защищает сервер от атак и может снизить его способность обслуживать органический трафик.
Я также обнаружил, что в некоторых случаях причиной 502/400 в случае многих заголовков может быть большое количество заголовков независимо от их размера. из документов
tune.http.maxhdr Устанавливает максимальное количество заголовков в запросе. Когда запрос приходит с числом заголовков, превышающим это значение (включая первую строку), он отклоняется кодом состояния «400 неверных запросов». Аналогично, слишком большие ответы блокируются с помощью «502 Bad Gateway». Значение по умолчанию - 101, что достаточно для всех случаев использования, учитывая, что широко развернутый сервер Apache использует тот же лимит. Может быть полезно увеличить этот предел, чтобы временно позволить приложению с ошибками работать к тому времени, когда оно будет исправлено. Имейте в виду, что каждый новый заголовок потребляет 32 бита памяти для каждой сессии, поэтому не устанавливайте этот предел слишком высоким.
https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#3.2-tune.http.maxhdr