2010-05-23 2 views
74

Ho sviluppato un'applicazione web PHP. Fornisco un'opzione all'utente per aggiornare più problemi in una sola volta. In tal modo, a volte l'utente incontra questo errore. C'è un modo per aumentare la lunghezza dell'URL in Apache?Come si risolve un errore HTTP 414 "Richiedi URI troppo lungo"?

+0

Se state vedendo questo errore su un server Windows e/o in un/ASP.NET app IIS, vedere la domanda: http://stackoverflow.com/q/23237538/ 12484 –

risposta

126

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

Tuttavia, si noti che se si sta effettivamente raggiungendo questo limite, si sta probabilmente abusando di GET per cominciare. Dovresti usare POST per trasmettere questo tipo di dati, specialmente dal momento che ammetti addirittura che lo stai usando per aggiornare i valori. Se controlli il link sopra, noterai che Apache dice addirittura "In condizioni normali, il valore non dovrebbe essere modificato rispetto al valore predefinito."

+0

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

+6

JPro: l'aggiornamento di un database è più o meno il motivo esatto per cui si usa il 'POST'. Nulla sull'uso di POST ti preclude dal compilare lo stesso modulo con i campi appena pubblicati, quindi non sono sicuro di cosa intendi con questo. –

+0

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

0

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

Il metodo POST viene utilizzato per richiedere che il server di origine accettare la un'entità racchiusa nella richiesta come nuova subordinata della risorsa identificata dal Request-URI nella Request Line. POST è progettato per consentire un metodo uniforme per coprire le seguenti funzioni:

  • Annotazione di risorse esistenti;
  • Invio di un messaggio a una bacheca, a un gruppo di discussione, a una mailing list, a oa un gruppo simile di articoli;
  • Fornire un blocco di dati, ad esempio il risultato di inviare un modulo , a un processo di gestione dati;
  • Estensione di un database tramite un'operazione di aggiunta.
+4

Non vedi come questo risponde alla domanda ..? – default

-4

Ho una soluzione semplice.

Supponiamo che l'URI abbia una stringa stringdata troppo lunga. Puoi semplicemente suddividerlo in un numero di parti in base ai limiti del tuo server. Quindi invia il primo, nel mio caso per scrivere un file. Quindi inviare i prossimi per aggiungere dati aggiunti in precedenza.

+0

Puoi fornire un esempio? Posso vedere come dividi la stringa quando viene generata dall'utente ... – endyourif

+1

Soluzione alternativa molto economica. È meglio riconsiderare il problema del dominio! –

+7

Questo non merita di avere così tanti downvotes. 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 amore e offriamo feedback invece di downvoting solo i nuovi arrivati ​​che non "ottengono" COSÌ ancora! – rinogo

10

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

jQuery Ajax POST example with PHP (Si noti la sanitize postato osservazione dei dati) e

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

In sostanza, la differenza è che la richiesta GET ha l'URL e parametri in una stringa e quindi invia nullo:

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

che la richiesta POST invia l'uRL, i parametri distinti comandi:

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

Ecco un esempio di lavoro:

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 più di 12.000 caratteri senza problemi.

1

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

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!"); 
    }); 
+1

è questa una risposta o una domanda? – Takarii

+0

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