Відповіді:
Ні, HTTP не визначає жодної межі. Однак більшість веб-серверів обмежують розмір заголовків, які вони приймають. Наприклад, в Apache ліміт за замовчуванням - 8 КБ, в IIS - 16 Кб . Сервер поверне 413 Entity Too Large
помилку, якщо розмір заголовків перевищить цю межу.
Пов'язане запитання: Наскільки великою може стати рядок агента користувача?
Як говорить vartec вище, специфікація HTTP не визначає межу, проте багато серверів роблять за замовчуванням. Це означає, практично кажучи, нижня межа - 8K . Для більшості серверів цей ліміт застосовується до суми рядка запиту та ВСІХ полів заголовка (тому тримайте файли cookie короткими).
Варто зазначити, що nginx за замовчуванням використовує розмір системної сторінки, який у більшості систем становить 4K. Ви можете перевірити за допомогою цієї крихітної програми:
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