Как устранить ошибку HTTP 414 «Запрос слишком длинного URI»?

79

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

  • 0
    Если вы видите эту ошибку на сервере Windows и / или в приложении IIS / ASP.NET, см. Вопрос: stackoverflow.com/q/23237538/12484
Теги:
http-status-codes

6 ответов

139
Лучший ответ

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

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

  • 0
    Сначала я попытался использовать POST, но это операция обновления базы данных, и я обновляю оригинальную страницу, используя значения, которые были первоначально размещены на этой странице.
  • 6
    JPro: Обновление базы данных - более или менее точная причина, по которой вы бы использовали POST . Ничто в использовании POST не мешает вам заполнять одну и ту же форму полями, которые были только что опубликованы, поэтому я не уверен, что вы подразумеваете под этим.
Показать ещё 7 комментариев
11

На основании ответа Джона я изменил запрос 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 символов без каких-либо проблем.

2

Я получил эту ошибку после использования $.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!");
    });
  • 1
    это ответ или вопрос?
  • 0
    Это хорошее быстрое решение. Переход от получения к публикации позволяет длинный URL-адрес без каких-либо изменений конфигурации сервера.
1

Выдержка из RFC 2616: протокол передачи гипертекста - HTTP/1.1 :

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

  • Аннотация существующих ресурсов;
  • Размещение сообщения на доске объявлений, в группе новостей, списке рассылки или в аналогичной группе статей;
  • Предоставление блока данных, такого как результат отправки формы, процессу обработки данных;
  • Расширение базы данных с помощью операции добавления.
  • 6
    Не видя, как это отвечает на вопрос ..?
  • 0
    Оригинальный плакат сказал, что записи обновляются. Для обновлений рекомендуется использовать POST или PUT, а не GET. Но, конечно, может случиться так, что максимальный лимит URL будет превышен при извлечении записей для отображения перед обновлением, и тогда пригодится метод GET, но он может потерпеть неудачу из-за этого ограничения. В оригинальном постере не было упомянуто, на каком этапе возникает проблема, поэтому можно предположить, что это было во время самого обновления, но мы не можем быть уверены ...
0

Смотрите этот ответ:

https://pt.stackoverflow.com/questions/350227/yii2-como-ordenar-o-gridview-em-um-formul%C3%A1rio-post-sem-perder-os-filtros-usa

В ответ вы уменьшите размер URL для использования метода GET.

-2

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

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

  • 0
    Можете ли вы привести пример? Я вижу, как вы разделяете строку, когда она генерируется пользователем ...
  • 2
    Очень дешевый обходной путь. Лучше пересмотреть проблему домена!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню