Ошибка 414 Request URI Too Large возникает в тех случаях, когда веб-сервер не способен обслужить запрос от клиента (т.е. веб-браузера или робота), потому что запрашиваемый URI (Request URI) длиннее, чем сервер может интерпретировать. Говоря простым языком, запрашиваемый веб-адрес слишком длинный, то есть содержит слишком много байтов.

Обычно в настройках веб-сервера заданы довольно широкие лимиты на длину URL-адресов, от 2k и вплоть до 8k символов. В Nginx задается число и размер буферов.

Так что если адрес верный и не содержит лишнего мусора, то самым простым способом решения проблемы будет реконфигурация веб-сервера.

Необходимо в файле конфигурации nginx.conf, который обычно расположен в /etc/nginx/nginx.conf добавить или изменить в секции server или http и https строчку: large_client_header_buffers 4 16k - изменение количества и размера буферов.

Здесь 16k байт и будет желаемым размером URL-адреса, а 4 - количеством желаемых буферов. В данному случае размер буферов более важен, чем их количество, так что в большинстве случаев параметр 4 будет оптимальным.

Длина URI не предусмотрена спецификацией

Протокол HTTP не ограничивает длину URI, так что сервер должен иметь возможность обработать любой запрос, даже с использованием метода GET. Но важно учитывать, что ограничение длины накладывают браузеры, под которые и нужно подстраиваться.

Решение проблемы методом POST

Справедливости ради стоит отметить, что метод реконфигурации веб-сервера не является идеальным. В большинстве случаев лучше разделить запрос на части и отправить их с помощью AJAX, к примеру. Но и такой способ может не подойти, если запрос нельзя разбивать или его отправляет библиотека JavaScript от третьей стороны. Повышение лимита длины запроса в настройках веб-сервера будет самым простым, но не единственным методом решения ошибки 414.

GET против POST

Пара переменной и ее значения в GET передается через URL-запрос:

GET /blog/?name1=value1&name2=value2 HTTP/1.1
Host: domain.com

пример GET-запроса.

Тогда как в POST она передается в теле самого заголовка:

POST /blog/ HTTP/1.1
Host: domain.com
name1=value1&name2=value2

пример POST-запроса.

Метод POST имеет ряд преимуществ перед GET: он более защищен, ведь большая часть запроса скрыта от пользователя; подходит для операций с большими данными.