web-dev-qa-db-fra.com

Comment résoudre une erreur HTTP 414 "Request URI too long"?

J'ai développé une application web PHP. Je donne à l'utilisateur la possibilité de mettre à jour plusieurs problèmes en une fois. Ce faisant, l'utilisateur rencontre parfois cette erreur. Est-il possible d'augmenter la longueur de l'URL dans Apache?

94
JPro

Sous Apache, la limite est une valeur configurable, LimitRequestLine. Définissez cette valeur sur une valeur supérieure à la valeur par défaut 8190 si vous souhaitez prendre en charge un URI de requête plus long. La valeur est dans /etc/Apache2/Apache2.conf . Sinon, ajoutez une nouvelle ligne (LimitRequestLine 10000) sous AccessFileName .htaccess.

Toutefois, notez que si vous rencontrez réellement cette limite, vous commencez probablement par abuser de GET. Vous devez utiliser POST pour transmettre ce type de données, d'autant plus que vous reconnaissez même que vous l'utilisez pour mettre à jour des valeurs. Si vous vérifiez le lien ci-dessus, vous remarquerez qu'Apache indique même "Dans des conditions normales, la valeur par défaut ne doit pas être modifiée."

151
John Feminella

Sur la base de la réponse de John, j'ai remplacé la demande GET par une demande POST. Cela fonctionne, sans avoir à changer la configuration du serveur. Alors je suis allé chercher comment implémenter ceci. Les pages suivantes ont été utiles:

exemple jQuery Ajax POST avec PHP (notez la remarque de désinfection des données postées) et

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

Fondamentalement, la différence est que la demande GET a l'URL et les paramètres dans une chaîne, puis envoie la valeur null:

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

alors que la demande POST envoie l'URL et les paramètres dans des commandes séparées:

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

Voici un exemple de travail:

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

?>

Je viens d'envoyer plus de 12 000 caractères sans aucun problème.

13
atmelino

J'ai eu cette erreur après avoir utilisé $ .getJSON () de JQuery. Je viens de changer pour poster:

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

J'ai une solution de contournement simple.

Supposons que votre URI ait une chaîne stringdata trop longue. Vous pouvez simplement le diviser en plusieurs parties en fonction des limites de votre serveur. Puis soumettez le premier, dans mon cas, pour écrire un fichier. Ensuite, soumettez les suivantes pour les ajouter aux données précédemment ajoutées.

2
Shrey Gupta

Un extrait de RFC 2616: Protocole de transfert d'hypertexte - HTTP/1.1 :

La méthode POST est utilisée pour demander au serveur d'origine d'accepter l'entité incluse dans la demande en tant que nouveau subordonné de la ressource identifiée par la requête Request. URI dans la ligne de demande. POST est conçu pour permettre à une méthode uniforme de couvrir les fonctions suivantes:

  • Annotation des ressources existantes;
  • Publier un message sur un babillard, un groupe de discussion, une liste de diffusion ou un groupe d'articles similaire;
  • Fournir un bloc de données, tel que le résultat de la soumission d'un formulaire, à un processus de traitement de données ;
  • Extension d'une base de données via une opération d'ajout.
1