Nginx большие cookies и ошибка сервера 400 Bad Request

Ситуация: относительно большой объем информации необходимо хранить в куках (суть не в целесообразности). Всё сделано, оттестировано локально (Apache) – всё отлично. Заливается на сервер (Nginx + Apache) – вроде все ок, пока не появляется ошибка 400..

Как оказывается, при увеличении размеров cookie,  заголовок запроса клиента не уместился в буфер для чтения, размер которого у nginx’а по умолчанию составляет 1K.
Директива: client_header_buffer_size
синтаксис: client_header_buffer_size размер;
умолчание: client_header_buffer_size 1k;
контекст: http, server
“Задаёт размер буфера для чтения заголовка запроса клиента. Для большинства запросов достаточно буфера размером в 1K байт. Однако если в запросе есть длинные cookies, или же запрос пришёл от WAP-клиента, то он может не поместиться в 1K. Поэтому, если строка запроса или поле заголовка запроса не помещаются полностью в этот буфер, то выделяются буферы большего размера, задаваемые директивой large_client_header_buffers.” (источник).
Директива: large_client_header_buffers
синтаксис: large_client_header_buffers число размер;
умолчание: large_client_header_buffer 4 8k;
контекст: http, server
“Задаёт максимальное число и размер буферов для чтения большого заголовка запроса клиента. Строка запроса не должна превышать размера одного буфера, иначе клиенту возвращается ошибка 414 (Request-URI Too Large). Поле заголовка запроса также не должно превышать размера одного буфера, иначе клиенту возвращается ошибка 400 (Bad Request). Буферы выделяются только по мере необходимости. По умолчанию размер одного буфера равен 8K байт. Если по окончании обработки запроса соединение переходит в состояние keep-alive, эти буферы освобождаются.” (источник).
Поэтому, при возникновении 400 ошибки предположительно по описанной причине, увеличиваем буферы чтения (значения подбираются по необходимости). Напр:

Также возможно понадобится отредактировать директивы proxy_buffers и proxy_buffer_size

Добавить комментарий

Ваш e-mail не будет опубликован.