webentwicklung-frage-antwort-db.com.de

Wie löse ich einen HTTP 414-Fehler "URI zu lang anfordern"?

Ich habe eine PHP Web App entwickelt. Ich gebe dem Benutzer die Möglichkeit, mehrere Probleme auf einmal zu aktualisieren. Dabei tritt manchmal der Fehler auf. Gibt es eine Möglichkeit dazu? Erhöhen Sie die Länge der URL in Apache?

94
JPro

Unter Apache ist das Limit ein konfigurierbarer Wert, LimitRequestLine. Ändern Sie diesen Wert in einen Wert, der größer als der Standardwert von 8190 ist, wenn Sie einen längeren Anforderungs-URI unterstützen möchten. Der Wert ist in /etc/Apache2/Apache2.conf. Wenn nicht, fügen Sie eine neue Zeile hinzu (LimitRequestLine 10000) unter AccessFileName .htaccess.

Beachten Sie jedoch, dass Sie GET von Anfang an missbrauchen, wenn Sie tatsächlich an dieses Limit stoßen. Sie sollten POST verwenden, um diese Art von Daten zu übertragen - zumal Sie sogar zugeben, dass Sie sie zum Aktualisieren von Werten verwenden. Wenn Sie den obigen Link überprüfen, werden Sie feststellen, dass Apache sogar sagt "Unter normalen Bedingungen sollte der Wert nicht vom Standardwert geändert werden."

151
John Feminella

Aufgrund der Antwort von John habe ich die GET-Anforderung in eine POST=) -Anforderung geändert. Sie funktioniert, ohne dass die Serverkonfiguration geändert werden muss. Daher habe ich mir überlegt, wie dies implementiert werden kann. Die folgenden Seiten waren hilfreich:

jQuery Ajax POST Beispiel mit PHP (Beachten Sie die Anmerkung zum Bereinigen von geposteten Daten) und

http://www.openjs.com/articles/ajax_xmlhttp_using_post.php

Grundsätzlich besteht der Unterschied darin, dass die GET-Anforderung die URL und die Parameter in einer Zeichenfolge enthält und dann null sendet:

http.open("GET", url+"?"+params, true);
http.send(null);

wohingegen die POST Anfrage die URL und die Parameter in separaten Befehlen sendet:

http.open("POST", url, true);
http.send(params);

Hier ist ein funktionierendes Beispiel:

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>';

?>

Ich habe gerade über 12.000 Zeichen ohne Probleme gesendet.

13
atmelino

Ich habe diesen Fehler erhalten, nachdem ich $ .getJSON () von JQuery verwendet habe. Ich habe gerade den Beitrag geändert:

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!");
    });
3
Fusca Software

Ich habe eine einfache Problemumgehung.

Angenommen, Ihr URI hat eine Zeichenfolge stringdata, die zu lang ist. Sie können es einfach in eine Reihe von Teilen aufteilen, abhängig von den Grenzen Ihres Servers. Dann reichen Sie die erste ein, um in meinem Fall eine Datei zu schreiben. Senden Sie dann die nächsten, um sie an zuvor hinzugefügte Daten anzuhängen.

2
Shrey Gupta

Ein Auszug aus dem RFC 2616: Hypertext Transfer Protocol - HTTP/1.1 :

Mit der Methode [~ # ~] post [~ # ~] wird angefordert, dass der Origin-Server die in der Anforderung enthaltene Entität als neuen Untergebenen akzeptiert der durch den Request-URI in der Request-Zeile identifizierten Ressource. POST soll eine einheitliche Methode ermöglichen, um die folgenden Funktionen abzudecken:

  • Annotation vorhandener Ressourcen;
  • Senden einer Nachricht an ein Schwarzes Brett, eine Newsgroup, eine Mailingliste oder eine ähnliche Artikelgruppe;
  • Bereitstellung eines Datenblocks, z. B. des Ergebnisses der Übermittlung eines Formulars, für einen Datenverarbeitungsprozess ;
  • Erweiterung einer Datenbank durch eine Append-Operation.
1