Как разрешить ошибку HTTP 414 «Request URI too long»?

Я разработал веб-приложение PHP. Я даю пользователю возможность обновлять сразу несколько проблем. При этом иногда пользователь сталкивается с этой ошибкой. Есть ли способ увеличить длину URL-адреса в apache?

В Apache ограничение является настраиваемым значением LimitRequestLine . Измените это значение на нечто большее, чем его значение по умолчанию 8190, если вы хотите поддерживать более длинный URI запроса. Значение находится в /etc/apache2/apache2.conf . Если нет, добавьте новую строку ( LimitRequestLine 10000 ) в AccessFileName .htaccess .

Однако обратите внимание, что если вы действительно используете этот предел, вы, вероятно, злоупотребляете GET для начала. Вы должны использовать POST для передачи таких данных – тем более, что вы даже признаете, что используете его для обновления значений. Если вы проверите ссылку выше, вы заметите, что Apache даже говорит: «В обычных условиях значение не должно меняться от значения по умолчанию».

Основываясь на ответе Джона, я изменил запрос GET на запрос POST. Он работает без изменения конфигурации сервера. Поэтому я пошел посмотреть, как это реализовать. Следующие страницы были полезны:

Пример JQuery AJAX POST с PHP (обратите внимание на примечание о данных для санитизации) и

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

Метод POST используется для запроса, чтобы исходный сервер принял объект, заключенный в запросе, в качестве нового подчиненного ресурса, идентифицированного Request-URI в строке запроса. POST предназначен для обеспечения единообразного метода для покрытия следующих функций:

  • Аннотация существующих ресурсов;
  • Публикация сообщения на доске объявлений, в новостной группе, в списке рассылки или в аналогичной группе статей;
  • Предоставление блока данных, например, результата отправки формы, процессу обработки данных ;
  • Расширение базы данных с помощью операции добавления.

У меня есть простой способ обхода.

Предположим, что ваш URI имеет строковые строковые stringdata которые слишком длинны. Вы можете просто разбить его на несколько частей в зависимости от пределов вашего сервера. Затем отправьте первый, в моем случае, напишите файл. Затем отправьте следующие, чтобы добавить к ранее добавленным данным.