2009-08-17 16 views
53

Qual è la lunghezza massima di un URL in apache? Dove è documentato ed è configurabile?Qual è la lunghezza massima dell'URL di Apache?

Sto implementando un provider di identità openID e vorrei conoscere i limiti a cui sono confrontato. Conosco il limite del percorso di 2048 byte su Internet Explorer. Questo può essere gestito appositamente utilizzando il rilevamento di user-agent. Altri browser hanno limiti di URL molto più alti.

Quindi quello che mi interessa sono i limiti del server Apache durante la codifica di un'applicazione.

+0

Duplicato: http://stackoverflow.com/questions/417142/quello-è-il-massimo-di-fine-in-anlurl –

+6

Non duplicato. Ma il riferimento di S.Lott è utile. OP sta chiedendo limitazioni specifiche del server. – maxwellb

risposta

63

Il limite predefinito per la lunghezza del request line è 8190 byte (vedi LimitRequestLine directive). E se sottraiamo tre byte per il metodo di richiesta (ad esempio GET), otto byte per le informazioni sulla versione (ad esempio HTTP/1.0/HTTP/1.1) e due byte per lo spazio di separazione, si ottengono 8177 byte per il percorso URI più query.

+7

Hai ragione. L'ho provato con Apache 2.2.11 e la regolazione di LimitRequestLine funziona bene. Per i calci, l'ho usato con successo con url 128K. – Stef

+3

Hai dovuto ricompilare per utilizzare valori così grandi? La mia versione (2.2.15) ignora silenziosamente le direttive LimitRequestLine su 8190 a meno che non venga ricompilata con CFLAG aggiunto "-D DEFAULT_LIMIT_REQUEST_LINE = 16384" (quindi consente fino a 16384). –

+4

Si noti che questo è __bytes__; con caratteri multibyte urlencoded, è piuttosto facile raggiungere questo limite (dato che un carattere di n byte impiega n * 3 byte: '☢' diventa'% E2% 98% A2'). – Piskvor

6

La lunghezza ufficiale secondo i documenti ufficiali Apache è 8.192, ma molte persone hanno avuto problemi a ~ 4.000.

MS Internet Explorer è in genere comunque il fattore limitante, poiché limita la dimensione massima dell'URL a 2.048.

15
  • Internet Explorer: 2.083 caratteri, con non più di 2.048 caratteri nella parte di percorso dell'URL
  • Firefox: 65.536 caratteri appaiono, ma gli URL lunghi non funzionano ancora, anche fino oltre 100.000
  • Safari: > 80.000 caratteri
  • Opera:> 190.000 caratteri
  • IIS: 16.384 caratteri, ma è configurabile
  • Apache: 4.000 caratteri

Da: http://www.danrigsby.com/blog/index.php/2008/06/17/rest-and-max-url-size/

+3

Il link citato è morto. – Starx

+0

* o è * https://web.archive.org/web/20120330062735/http://www.danrigsby.com:80/blog/index.php/2008/06/17/rest-and-max- url-size – samdd

2

La dimensione predefinita dell'URI consentita è di 8177 caratteri nella richiesta GET. Semplice codice in python per tali test.

#!/usr/bin/env python2 

import sys 
import socket 

if __name__ == "__main__": 
    string = sys.argv[1] 
    buf_get = "x" * int(string) 
    buf_size = 1024 
    request = "HEAD %s HTTP/1.1\nHost:localhost\n\n" % buf_get 
    print "===>", request 

    sock_http = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock_http.connect(("localhost", 80)) 
    sock_http.send(request) 
    while True: 
     print "==>", sock_http.recv(buf_size) 
     if not sock_http.recv(buf_size): 
      break 
    sock_http.close() 

Su 8178 caratteri si otterrà tale messaggio: HTTP/1.1 414 Request-URI troppo grande

+1

Questa è la lunghezza predefinita, modificabile con la direttiva di configurazione LimitRequestLine. – Stef

3

Ecco uno script bash per controllare il limite massimo di un server remoto (usa ricciolo e Perl).

Hai solo bisogno di una sorta di URL che può essere esteso con 'x' e restituire sempre 200 (o adattarlo alle tue esigenze). Ad un certo punto si romperà e lo script visualizzerà la lunghezza massima.

Ecco il codice:

url='http://someurl/someendpoint?var1=blah&token=' 
ok=0 
times=1 

while :; do 
    length=$((times+${#url})) 
    echo trying with $length 
    token=$(perl -le 'print "x"x'$times) 
    result=$(curl -sLw '%{http_code}' -o /dev/null "${url}${token}") 

    if [[ $result == 200 ]]; then 
     if [[ $ok == $times ]]; then 
      echo "max length is $length" 
      break 
     fi 
     ok=$times 
     times=$((times+1024)) 
    else 
     times=$(((times+ok)/2)) 
    fi 
done 
0

Il limite predefinito per la lunghezza della linea di richiesta è 8192 byte = 8 * 1024. E si desidera modificare il limite, è necessario aggiungere o aggiornare nel vostro tomcat server.xml l'attributo maxHttpHeaderSize.

come:

<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... /> 

In questo esempio impostare il limite di 65536 byte = 64 * 1024.

Spero che questo possa essere d'aiuto.

Problemi correlati