Quelle est la longueur maximale d'une URL dans apache? Où est-il documenté et est-il configurable?
J'implémente un fournisseur d'identité openid et j'aimerais connaître les limitations auxquelles je suis confronté. Je connais la limite de chemin d'accès de 2048 octets sur Internet Explorer. Cela peut être géré spécialement à l'aide de la détection d'agent utilisateur. D'autres navigateurs ont des limites d'URL beaucoup plus élevées.
Donc, ce qui m'intéresse, c'est les limites du serveur Apache lors du codage d'une application.
La limite par défaut pour la longueur de la ligne de requête est de 8190 octets (voir directive LimitRequestLine
). Et si nous soustrayons trois octets pour la méthode de demande (c'est-à-dire GET
), huit octets pour les informations de version (c'est-à-dire HTTP/1.0
/HTTP/1.1
) et deux octets pour l'espace de séparation, nous nous retrouvons avec 8177 octets pour le chemin URI plus la requête.
De: http://www.danrigsby.com/blog/index.php/2008/06/17/rest-and-max-url-size/
La longueur officielle selon les documents officiels d'Apache est de 8 192, mais beaucoup de gens ont rencontré des problèmes à environ 4 000.
MS Internet Explorer est généralement le facteur limitant de toute façon, car il limite la taille maximale de l'URL à 2048.
Voici un script bash pour vérifier la limite maximale d'un serveur distant (utilise curl et Perl).
Vous avez juste besoin d'une sorte d'URL qui peut être étendue avec 'x' et toujours renvoyer 200 (ou l'adapter à vos besoins). À un moment donné, il se cassera et le script affichera la longueur maximale.
Voici le code:
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
La taille par défaut autorisée de l'URI est de 8177 caractères dans la demande GET. Code simple en python pour de tels tests.
#!/usr/bin/env python2
import sys
import socket
if __== "__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()
Sur 8178 caractères, vous obtiendrez un tel message: HTTP/1.1 414 Request-URI Too Large