Как устранить ошибку HTTP 414 "запрос URI слишком долго"?
Я разработал веб-приложение PHP. Я даю возможность пользователю обновить несколько вопросов на одном дыхании. При этом иногда пользователь сталкивается с этой ошибкой. Есть ли способ увеличить длину URL в apache?
5 ответов:
в Apache предел является настраиваемым значением,
LimitRequestLine
. Измените это значение на что-то большее, чем его значение по умолчанию 8190, если вы хотите поддерживать более длинный URI запроса. Значение находится в / etc/apache2 / apache2.conf. Если нет, добавьте новую строку (LimitRequestLine 10000
) подAccessFileName .htaccess
.однако обратите внимание, что если вы на самом деле сталкиваетесь с этим ограничением, вы, вероятно, злоупотребляете
GET
для начала. Вы должны использоватьPOST
для передачи такого рода данных-тем более, что вы даже признаете, что используете его для обновления значений. Если вы проверите ссылку выше, вы заметите, что Apache даже говорит: "в нормальных условиях значение не должно быть изменено по умолчанию."
основываясь на ответе Джона, я изменил запрос GET на запрос POST. Он работает, не меняя конфигурацию сервера. Поэтому я пошел смотреть, как это реализовать. Следующие страницы были полезны:
jQuery Ajax POST пример с PHP (Обратите внимание на замечание sanitize posted data) и
http://www.openjs.com/articles/ajax_xmlhttp_using_post.php
в принципе, разница в том, что запрос GET имеет url и параметры в одной строке, а затем отправляет null:
http.open("GET", url+"?"+params, true); http.send(null);
в то время как запрос POST отправляет url и параметры в отдельных командах:
http.open("POST", url, true); http.send(params);
вот пример:
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>'; ?>
Я только что отправил более 12 000 символов без каких-либо проблем.
Я получил эту ошибку после использования $.getJSON () из JQuery. Я просто изменил сообщение:
data = getDataObjectByForm(form); var jqxhr = $.post(url, data, function(){}, 'json') .done(function (response) { if (response instanceof Object) var json = response; else var json = $.parseJSON(response); // console.log(response); // console.log(json); jsonToDom(json); if (json.reload != undefined && json.reload) location.reload(); $("body").delay(1000).css("cursor", "default"); }) .fail(function (jqxhr, textStatus, error) { var err = textStatus + ", " + error; console.log("Request Failed: " + err); alert("Fehler!"); });
выписка из RFC 2616: протокол передачи гипертекста -- HTTP / 1.1:
The POST метод используется для запроса, чтобы исходный сервер принял сущность, вложенная в запрос в качестве нового подчиненного ресурса идентифицируется с помощью запроса-URI в строке запроса. Пост предназначен чтобы единый метод охватывал следующие функции:
- Аннотация существующую ресурсы;
- размещение сообщения на доске объявлений, в группе новостей, в списке рассылки, или аналогичная группа статей;
- предоставление блока данных, например результата отправки форма, к процессу обработки данных;
- расширение базы данных с помощью операции добавления.
У меня есть простой обходной путь.
предположим, что ваш URI имеет строку
stringdata
Это слишком долго. Вы можете просто разбить его на несколько частей в зависимости от ограничения вашего сервера. Затем отправьте первый, в моем случае, чтобы написать файл. Затем отправьте следующие, чтобы добавить к ранее добавленным данным.