Як вирішити помилку HTTP 414 "Запросити URI занадто довго"?


103

Я розробив веб-додаток PHP. Я даю можливість користувачеві оновлювати декілька проблем за один раз. Роблячи це, іноді користувач стикається з цією помилкою. Чи є спосіб збільшити довжину URL-адреси в апачі?


Якщо ви бачите цю помилку на сервері Windows та / або в додатку IIS / ASP.NET, дивіться питання: stackoverflow.com/q/23237538/12484
Джон Шнайдер

Відповіді:


166

Під Apache, межа настроюється значення, LimitRequestLine. Змініть це значення на щось більше, ніж за замовчуванням 8190, якщо ви хочете підтримати довший URI запиту. Значення знаходиться в /etc/apache2/apache2.conf . Якщо ні, додайте новий рядок ( LimitRequestLine 10000) під AccessFileName .htaccess.

Однак зауважте, що якщо ви насправді стикаєтесь з цією межею, ви, мабуть, зловживаєте GETдля початку. Ви повинні використовувати POSTдля передачі подібного роду дані, тим більше, що ви навіть визнаєте, що використовуєте їх для оновлення значень. Якщо ви перевірте посилання вище, ви помітите, що Apache навіть каже: "У звичайних умовах значення не слід змінювати з типових".


Спочатку я спробував використовувати POST, але це операція оновлення бази даних, і я оновлюю початкову сторінку за допомогою значень, які були спочатку розміщені на цій сторінці.
JPro

8
JPro: Оновлення бази даних - це більш-менш точна причина, яку ви б використали POST. Ніщо про використання POST не перешкоджає заповненню тієї самої форми з опублікованими полями, тому я не впевнений, що ви маєте на увазі під цим.
Джон Фемінелла

1
@JPro: Звичайна техніка в цьому випадку - розміщення на ту саму сторінку. Обробник сторінки (який може бути однаковим кодом як для GET, так і для POST) спочатку перевіряє параметри POST, обробляє їх, якщо їх знаходить, а потім повертає сторінку із заповненими належними значеннями, які будуть або оновленими значеннями ( якщо POST та оновлення проходять успішно) або початкові значення (якщо GET або якщо POST та оновлення не вдається). Якщо оновлення не вдається, ви навіть можете мати повідомлення про помилки, що описують помилку.
Майк Десимоне

5
Я зрозумів це досить пізно, тому хотів би поділитися цим. Якщо ви не можете знайти слово LimitRequestLineніде у вашому файлі httpd.conf, просто додайте рядок самостійно куди завгодно. Наприклад:LimitRequestLine 100000
Jules Colle

дякую за відповідь та пояснення, ти врятував мені день. :)
може saghira

16

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


4

У мене просте вирішення.

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


Чи можете ви навести приклад? Я бачу, як ви розділяєте рядок, коли його генерує користувач ...
endyourif

4
Дуже дешеве рішення. Краще переглянути проблему домену!
Muhammad Hewedy

13
Це не заслуговує на те, щоб мати стільки потоків. Звичайно, є ситуації, коли подання декількох запитів може бути прийнятним рішенням. Щоправда, якість відповіді дещо низька, але цього можна очікувати від користувача, який є новим для SO. Давайте покажемо трохи любові та запропонуємо відгуки, а не просто прихильнювати новачків, які поки що "не" так!
rinogo

1
Я згоден, це виглядає життєздатним
Феліпе Вальдес

3

Я отримав цю помилку після використання $ .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!");
    });

2
це відповідь чи питання?
Такарій

Це хороше швидке виправлення. Перехід від місця до місця дозволяє довгу URL-адресу без зміни конфігурації сервера.
mt025

1

Уривок з RFC 2616: протокол передачі гіпертексту - HTTP / 1.1 :

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

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

8
Не бачачи, як це відповідає на питання ..?
Афр

Оригінальний плакат сказав, що записи оновлюються. Для оновлень корисно використовувати POST або PUT, а не GET. Але, звичайно, можливо, що максимальна межа URL-адреси буде перевищена під час отримання записів, які відображатимуться перед оновленням, і тоді метод GET є відповідним, але через цей ліміт може не вдатися. У початковому плакаті не було зазначено, на якому етапі виникає проблема, тому можна припустити, що це було під час самого оновлення, але ми не можемо бути впевнені ...
JustAMartin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.