HTTP response status code 414 URI Too Long is a client error that is returned by the server to indicate that the URI exceeds the length that it allows.
Usage
When the 414 URI Too Long error message is received, the client understands that the server expects a smaller HTTP path or address. While the specification does not stipulate any requirement for length, in practice, browsers may limit the size to prevent certain types of attacks.
For example, many web applications limits the size of the URL for an HTTP GET request to 2,048 characters. This, however, may not be a limit enforced by the server or browser.
Note
Search engines like Google will not index a URL with 414 URI Too Long response status, and consequently, URLs that have been indexed in the past but are now returning this HTTP status code will be removed from the search results.
Example
In the example, the client requests a resource using a URI that is beyond what the server allows.
Request
GET /<…a_long_URI…> HTTP/1.1
Host: www.example.ai
Response
HTTP/1.1 414 URI Too Long
Code references
.NET
HttpStatusCode.RequestUriTooLong
Rust
http::StatusCode::URI_TOO_LONG
Rails
:request_uri_too_long
Go
http.StatusRequestURITooLong
Symfony
Response::HTTP_REQUEST_URI_TOO_LONG
Python3.5+
http.HTTPStatus.REQUEST_URI_TOO_LONG
Java
java.net.HttpURLConnection.HTTP_REQ_TOO_LONG
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_REQUEST_URI_TOO_LONG
Angular
@angular/common/http/HttpStatusCode.UriTooLong
Takeaway
The 414 URI Too Long status code is a client error that occurs when the URI is larger than the server is willing to accept.
See also
- RFC 7231
Last updated: June 2, 2022
Ошибка 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: он более защищен, ведь большая часть запроса скрыта от пользователя; подходит для операций с большими данными.
Based on John’s answer, I changed the GET request to a POST request. It works, without having to change the server configuration. So I went looking how to implement this. The following pages were helpful:
jQuery Ajax POST example with PHP
(Note the sanitize posted data remark) and
http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
Basically, the difference is that the GET request has the url and parameters in one string and then sends null:
http.open("GET", url+"?"+params, true);
http.send(null);
whereas the POST request sends the url and the parameters in separate commands:
http.open("POST", url, true);
http.send(params);
Here is a working example:
ajaxPOST.html:
<html>
<head>
<script type="text/javascript">
function ajaxPOSTTest() {
try {
// Opera 8.0+, Firefox, Safari
ajaxPOSTTestRequest = new XMLHttpRequest();
} catch (e) {
// Internet Explorer Browsers
try {
ajaxPOSTTestRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
ajaxPOSTTestRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
// Something went wrong
alert("Your browser broke!");
return false;
}
}
}
ajaxPOSTTestRequest.onreadystatechange = ajaxCalled_POSTTest;
var url = "ajaxPOST.php";
var params = "lorem=ipsum&name=binny";
ajaxPOSTTestRequest.open("POST", url, true);
ajaxPOSTTestRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
ajaxPOSTTestRequest.send(params);
}
//Create a function that will receive data sent from the server
function ajaxCalled_POSTTest() {
if (ajaxPOSTTestRequest.readyState == 4) {
document.getElementById("output").innerHTML = ajaxPOSTTestRequest.responseText;
}
}
</script>
</head>
<body>
<button onclick="ajaxPOSTTest()">ajax POST Test</button>
<div id="output"></div>
</body>
</html>
ajaxPOST.php:
<?php
$lorem=$_POST['lorem'];
print $lorem.'<br>';
?>
I just sent over 12,000 characters without any problems.
Ошибка 414 или Error 414 Request URI Too Large — почему она возникает и как ее устранить простому пользователю или владельцу собственного сайта. Начнем с того, что это довольно редкая, не распространенная ошибка. В оригинале ее название — Request URI Too Large.
Вы можете столкнуться с ошибкой 414 в случае, когда адрес, который Вами запрашивается, слишком длинный. Серверу не удается его растолковать, в результате чего, на своих экранах вы видите данную ошибку.
Стоит заметить, что любой запрос условно делится на две составляющие:
- Заголовок;
- Тело.
В нормальных условиях в заголовке содержится только общая информация. Это значит, что он по своей природе не может быть слишком длинным. Тело же в свою очередь наоборот содержит всю основную часть запроса. Каким бы длинным и ёмким не было тело, сервер воспринимает это за норму и ошибка 414 не должна возникать. Так что в большинстве случаев причиной данной неполадки является именно заголовок и сбои в нем.
Как избавиться от ошибки 414?
Обычному пользователю никак. Если во время сёрфинга в Интернете вы столкнулись с этой нераспространенной проблемой, вы абсолютно бессильны. Нужно просто ждать, пока администраторы злосчастной страницы исправят ситуацию. Единственное, что доступно обычному пользователю – написание запроса в техническую поддержку.
Каковы действия должен совершить владелец сайта для того, чтобы исправить ошибку 414?
- Попытаться исключить ошибку непосредственно в коде ресурса.
- Сделать больше допустимый размер заголовка. За это отвечает 3 параметра, которые необходимо разместить в http:
- сlіеnt_bоdу_buffеr_sіzе — отвечает за размер тела;
- сlіеnt_hеаdеr_buffеr_sіzе — отвечает за обычные заголовки;
- lаrgе_clіеnt_hеаdеr_buffеrs — отвечает за большие заголовки.
В случае с ошибкой 414 нам необходимо работать с последней строкой. Стандартно размер заголовка = 8kb. Вносим изменения в последнюю строку – дописываем 8 (пробел) 64k. Точно такие же исправления необходимо сделать в каждой строке перед секцией под названием «сервер». Теперь перезагружаем ресурс, ошибка 414 должна уйти. Если нет, то это означает, что вы сделали что-то неправильно.
Напоследок хотелось бы заметить, что если вы совсем не разбираетесь в системе nginx, то не делайте никаких изменений самостоятельно. Так вы не только не решите проблему, но и рискуете встретиться с другими ошибками в дальнейшем. В таком случае лучше обратиться к специалистам, для них справиться с этим не составит особого труда.