web-dev-qa-db-ja.com

Apacheの最大URL長は何ですか?

ApacheのURLの最大長は?それはどこで文書化され、構成可能ですか?

私はopenid IDプロバイダーを実装していますが、私が直面している制限について知りたいです。 Internet Explorerの2048バイトのパス制限について知っています。これは、ユーザーエージェント検出を使用して特別に処理できます。他のブラウザでは、URLの制限がはるかに高くなっています。

私が興味を持っているのは、アプリケーションをコーディングするときのApacheサーバーの制限です。

59
Stef

request line の長さのデフォルトの制限は8190バイトです( LimitRequestLine directive を参照)。そして、リクエストメソッドのために3バイトを差し引くと(すなわち、GET)、バージョン情報のために8バイトを差し引くと(すなわち、HTTP/1.0/HTTP/1.1)および区切りスペース用の2バイト、URIパスとクエリ用の8177バイトになります。

67
Gumbo
  • Internet Explorer:2,083文字、URLのパス部分は2,048文字以下
  • Firefox:65,536文字が表示されますが、長いURLは100,000を超えても引き続き機能します
  • Safari:> 80,000文字
  • Opera:190,000文字以上
  • IIS:16,384文字ですが、構成可能です
  • Apache:4,000文字

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

17
lo_fye

公式のApacheドキュメントによると、公式の長さは8,192ですが、多くの人が〜4,000で問題に直面しています。

MS Internet Explorerは、最大URLサイズを2,048に制限するため、通常はとにかく制限要因です。

6
RightFullRudder

リモートサーバーの最大制限を確認するための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
3
estani

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

2
Tom Lime