Что не так с адресом
Код 414 означает, что строка адреса, которую прислал клиент, длиннее предела, который готов обработать сервер. Слово «адрес» здесь надо понимать шире, чем домен и путь: в него входит и строка параметров после знака вопроса. Именно она чаще всего разрастается до огромных размеров.
Спецификации не задают единого числа, поэтому у каждой программы свои пределы. Обычно веб-серверы принимают адреса в несколько тысяч символов, а некоторые прокси и шлюзы ограничивают их ниже. Ошибка возникает, когда хотя бы один узел на пути посчитал адрес слишком длинным.
Откуда берутся длинные ссылки
Самый частый источник — форма, отправляемая методом GET вместо POST. При таком способе все поля попадают прямо в адрес, и большой текст или множество фильтров дают ссылку на тысячи символов. Второй источник — накапливающиеся параметры: каждый переход добавляет ещё одну метку, и через несколько шагов адрес раздувается.
Третий вариант — зацикленный редирект, который на каждом круге дописывает параметр в конец адреса. Четвёртый — приложения, передающие в адресе сериализованное состояние, например список выбранных товаров или длинный токен. Наконец, бывают вирусные или рекламные вставки, которые прицепляют к ссылке километры параметров отслеживания.
Как проверить себя
Скопируйте адрес из строки браузера в текстовый редактор и посмотрите, насколько он длинный и что именно в нём повторяется. Часто сразу видно, что один и тот же параметр встречается десятки раз. Если это так, начните переход заново с главной страницы сайта, а не из закладки со старым «хвостом».
Затем сократите ссылку вручную: удалите всё после вопросительного знака и откройте страницу без параметров. Если она загрузилась, добавляйте параметры по одному и найдите тот, что ломает запрос. Проверьте, не создаёт ли расширение браузера или рекламный модуль лишние метки.
Решения для посетителя
Откройте страницу по чистому адресу, очистите файлы cookie сайта, если состояние хранится в них, и повторите действие. Если нужно поделиться большим фильтром, сохраните его в закладке или используйте функцию «сохранить поиск», которую предлагает сайт. Не пользуйтесь сервисами, которые склеивают десятки ссылок в одну, если ошибка возникает при таком переходе.
Если проблема появляется при отправке формы, попробуйте сократить введённый текст или разбить его на части. Иногда помогает другой браузер: у них разные внутренние пределы, но серверный лимит от этого не меняется.
Если вы владелец сайта
Переведите отправку крупных форм на POST и не передавайте состояние в адресе. Найдите циклы редиректов, накапливающие параметры. Если законно нужен длинный адрес, можно поднять лимит в настройках веб-сервера и прокси, но делать это необходимо во всей цепочке, иначе ошибка просто сменит источник. Слишком высокий предел также облегчает злоупотребления, поэтому увеличивайте его в разумных пределах.
Полезно логировать отклонённые запросы: по ним хорошо видно, какая часть сайта раздувает адреса.
Почему нельзя просто «поднять лимит»
Соблазн увеличить порог до огромного значения понятен, но у такого решения есть оборотная сторона. Длинные адреса записываются в журналы, попадают в историю браузеров, передаются в заголовках Referer другим сайтам и плохо переносятся между программами. Если в адресе лежит что-то чувствительное, оно окажется в местах, где его не ожидают увидеть.
В адресе не следует передавать личные данные, токены доступа и содержимое форм: строка попадает в логи всех промежуточных узлов. Для таких данных подходит тело запроса, которое обычно не протоколируется целиком. Если вы всё же вынуждены пользоваться длинными ссылками, например для сохранения состояния карты или фильтра, храните состояние на сервере и передавайте в адресе только короткий идентификатор. Тогда ссылка остаётся удобной, работает во всех мессенджерах и не упирается в лимиты.
Не путайте 414 с 413: там ограничивается размер тела запроса, например загружаемого файла, а здесь только строка адреса. От 400 он отличается конкретностью: сервер точно знает причину и сообщает её. Если вы видите 400 при длинных ссылках, возможно, вы столкнулись с таким же лимитом, только в другой реализации, где сервер не использует специальный код.
В любом случае помните: ссылка, которую невозможно вставить в письмо или сообщение целиком, почти всегда указывает на проблему проектирования, а не на сбой вашего интернета.