Come posso risolvere un errore HTTP 414 "Request URI too long"?


103

Ho sviluppato un'app Web PHP. Sto dando la possibilità all'utente di aggiornare più problemi in una volta sola. In tal modo, a volte l'utente incontra questo errore. C'è un modo per aumentare la lunghezza dell'URL in Apache?


Se viene visualizzato questo errore su un server Windows e / o in un'app IIS / ASP.NET, vedere la domanda: stackoverflow.com/q/23237538/12484
Jon Schneider

Risposte:


166

Sotto Apache, il limite è un valore configurabile, LimitRequestLine. Modificare questo valore in qualcosa di più grande del valore predefinito di 8190 se si desidera supportare un URI di richiesta più lungo. Il valore è in /etc/apache2/apache2.conf . In caso contrario, aggiungi una nuova riga ( LimitRequestLine 10000) sotto AccessFileName .htaccess.

Tuttavia, tieni presente che se stai effettivamente raggiungendo questo limite, probabilmente stai abusando GETper cominciare. Dovresti usarlo POSTper trasmettere questo tipo di dati, soprattutto perché ammetti persino di usarlo per aggiornare i valori. Se controlli il collegamento sopra, noterai che Apache dice anche "In condizioni normali, il valore non dovrebbe essere modificato rispetto a quello predefinito".


All'inizio ho provato a utilizzare POST, ma questa è un'operazione di aggiornamento sul database e sto aggiornando la pagina originale utilizzando i valori originariamente pubblicati su quella pagina.
JPro

8
JPro: L'aggiornamento di un database è più o meno il motivo esatto che useresti POST. Niente sull'utilizzo di POST ti impedisce di compilare lo stesso modulo con i campi che sono stati appena pubblicati, quindi non sono sicuro di cosa intendi con questo.
John Feminella

1
@JPro: la tecnica usuale in questo caso è POST nella stessa pagina. Il gestore della pagina (che può essere lo stesso codice sia per GET che per POST) controlla prima i parametri POST, li gestisce se li trova, quindi restituisce la pagina con i valori corretti inseriti, che saranno i valori aggiornati ( se POST e l'aggiornamento ha esito positivo) o i valori originali (se GET o se POST e l'aggiornamento non riesce). Se l'aggiornamento non riesce, puoi persino visualizzare messaggi di errore per campo che descrivono l'errore.
Mike DeSimone

5
L'ho capito abbastanza tardi, quindi vorrei condividerlo. Se non riesci a trovare la parola da LimitRequestLinenessuna parte nel tuo file httpd.conf, aggiungi semplicemente la riga dove preferisci. Ad esempio:LimitRequestLine 100000
Jules Colle

grazie per la risposta e la spiegazione, mi hai salvato la giornata. :)
maggio saghira

16

In base alla risposta di John, ho modificato la richiesta GET in una richiesta POST. Funziona, senza dover modificare la configurazione del server. Quindi sono andato a cercare come implementarlo. Le seguenti pagine sono state utili:

jQuery Ajax POST esempio con PHP (nota il commento di sanitize sui dati pubblicati) e

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

Fondamentalmente, la differenza è che la richiesta GET ha l'URL ei parametri in una stringa e quindi invia null:

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

mentre la richiesta POST invia l'url ei parametri in comandi separati:

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

Ecco un esempio funzionante:

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

?>

Ho appena inviato oltre 12.000 caratteri senza problemi.


4

Ho una soluzione semplice.

Supponi che il tuo URI abbia una stringa stringdatatroppo lunga. Puoi semplicemente suddividerlo in un numero di parti a seconda dei limiti del tuo server. Quindi invia il primo, nel mio caso per scrivere un file. Quindi invia i successivi da aggiungere ai dati aggiunti in precedenza.


Puoi fornire un esempio? Posso vedere come
dividi

4
Soluzione molto economica. È meglio riconsiderare il problema del dominio!
Muhammad Hewedy

13
Questo non merita di avere così tanti voti negativi. Ci sono certamente situazioni in cui l'invio di più richieste può essere una soluzione accettabile. È vero, la qualità della risposta è un po 'bassa, ma c'è da aspettarselo da un utente che è nuovo di zecca in SO. Mostriamo un po 'di affetto e offriamo feedback invece di limitarci a votare i nuovi arrivati ​​che ancora non "ottengono" COSÌ!
rinogo

1
Sono d'accordo, sembra fattibile
Felipe Valdes

3

Ho ricevuto questo errore dopo aver utilizzato $ .getJSON () da JQuery. Ho appena cambiato per postare:

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
è una risposta o una domanda?
Takarii

Questa è una buona soluzione rapida. Il passaggio da get a post consente l'URL lungo senza alcuna modifica alla configurazione del server.
mt025

1

Un estratto dalla RFC 2616: Hypertext Transfer Protocol - HTTP / 1.1 :

Il metodo POST viene utilizzato per richiedere che il server di origine accetti l'entità racchiusa nella richiesta come nuovo subordinato della risorsa identificata dall'URI della richiesta nella riga della richiesta. POST è progettato per consentire un metodo uniforme per coprire le seguenti funzioni:

  • Annotazione delle risorse esistenti;
  • Invio di un messaggio a una bacheca, un newsgroup, una mailing list o un gruppo di articoli simile;
  • Fornire un blocco di dati, come il risultato dell'invio di un modulo, a un processo di trattamento dei dati ;
  • Estensione di un database tramite un'operazione di accodamento.

8
Non vedendo come questo risponde alla domanda ..?
Afr

Il poster originale diceva che i record sono in fase di aggiornamento. Per gli aggiornamenti, è buona norma utilizzare POST o PUT e non GET. Ma, naturalmente, potrebbe essere che il limite massimo dell'URL venga superato durante il recupero dei record da visualizzare prima dell'aggiornamento, quindi il metodo GET è appropriato, ma può fallire a causa di questo limite. Il poster originale non menzionava in quale fase sorge il problema, quindi si può presumere che sia stato durante l'aggiornamento stesso, ma non possiamo essere sicuri ...
JustAMartin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.