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

j'ai développé une application web PHP. Je donne une option à l'utilisateur pour mettre à jour plusieurs problèmes en une seule fois. Ce faisant, l'Utilisateur rencontre parfois cette erreur. Y a-t-il un moyen d'augmenter la longueur D'URL dans apache?

79
demandé sur John Feminella 2010-05-23 15:50:15

5 réponses

sous Apache, la limite est une valeur configurable, LimitRequestLine . Changez cette valeur en quelque chose de plus grand que sa valeur par défaut de 8190 si vous voulez supporter un URI de requête plus long. La valeur est dans /etc/apache2/apache2.conf . Dans la négative, ajouter une nouvelle ligne ( LimitRequestLine 10000 ) sous AccessFileName .htaccess .

cependant, notez que si vous êtes effectivement dans cette limite, vous abusez probablement GET pour commencer avec. Vous devriez utiliser POST pour transmettre ce genre de données-d'autant plus que vous admettez même que vous l'utilisez pour mettre à jour les valeurs. Si vous cochez le lien ci-dessus, vous remarquerez Qu'Apache dit même "dans des conditions normales, la valeur ne doit pas être modifiée par rapport à la valeur par défaut."

131
répondu John Feminella 2017-06-22 17:13:32

basé sur la réponse de John, j'ai changé la requête GET en une requête POST. Cela fonctionne, sans devoir changer la configuration du serveur. Alors j'ai cherché comment mettre en œuvre ça. Les pages suivantes ont été utiles:

jQuery Ajax POST example with PHP (Veuillez noter la remarque concernant les données postées de sanitize) et

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

Fondamentalement, la différence est que la requête GET A l'url et les paramètres dans une chaîne et envoie ensuite null:

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

alors que la requête 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 pratique:

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.

11
répondu atmelino 2017-05-23 11:55:07

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!");
    });
2
répondu Fusca Software 2016-11-16 11:20:04

un extrait du RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1 :

la méthode POST est utilisée pour demander que le serveur d'origine accepte entité incluse dans la requête comme des subalternes de la ressource identifié par L'URI de la demande dans la ligne de la demande. POST est conçu pour permettre à une méthode uniforme de couvrir les fonctions suivantes:

  • Annotation de ressources existantes;
  • affichage d'un message sur un babillard, un groupe de discussion, une liste de diffusion, ou un groupe similaire d'articles;
  • fournir un bloc de données, tel que le résultat de la soumission d'un formulaire, à un traitement de données ;
  • extension D'une base de données par une opération d'ajout.
1
répondu Your Common Sense 2018-03-28 12:55:16

j'ai une solution simple.

supposons que votre URI a une chaîne de caractères stringdata qui est trop longue. Vous pouvez simplement le fractionner en plusieurs parties selon les limites de votre serveur. Puis soumettre le premier, dans mon cas pour écrire un dossier. Soumettez ensuite les données suivantes à ajouter aux données précédemment ajoutées.

-2
répondu Shrey Gupta 2012-09-04 15:01:37