ApacheのURLの最大長は?それはどこで文書化され、構成可能ですか?
私はopenid IDプロバイダーを実装していますが、私が直面している制限について知りたいです。 Internet Explorerの2048バイトのパス制限について知っています。これは、ユーザーエージェント検出を使用して特別に処理できます。他のブラウザでは、URLの制限がはるかに高くなっています。
私が興味を持っているのは、アプリケーションをコーディングするときのApacheサーバーの制限です。
request line の長さのデフォルトの制限は8190バイトです( LimitRequestLine
directive を参照)。そして、リクエストメソッドのために3バイトを差し引くと(すなわち、GET
)、バージョン情報のために8バイトを差し引くと(すなわち、HTTP/1.0
/HTTP/1.1
)および区切りスペース用の2バイト、URIパスとクエリ用の8177バイトになります。
From: http://www.danrigsby.com/blog/index.php/2008/06/17/rest-and-max-url-size/
公式のApacheドキュメントによると、公式の長さは8,192ですが、多くの人が〜4,000で問題に直面しています。
MS Internet Explorerは、最大URLサイズを2,048に制限するため、通常はとにかく制限要因です。
リモートサーバーの最大制限を確認するためのbashスクリプトを次に示します(curlとPerlを使用)。
'x'で拡張でき、常に200を返す(またはニーズに合わせて変更できる)何らかの種類のURLが必要です。ある時点で破損し、スクリプトは最大長を表示します。
コードは次のとおりです。
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
GETリクエストで許可されるURIのデフォルトサイズは8177文字です。このようなテストのためのpythonのシンプルなコード。
#!/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()
8178文字では、次のようなメッセージが表示されます:HTTP/1.1 414 Request-URI Too Large