Apache服务器中URL的最大长度是多少?它在哪里有记录,并且是否可以配置?
我正在实现一个OpenID身份提供者,并想了解我所面临的限制。我知道Internet Explorer有2048字节路径限制,可以使用用户代理检测进行特殊处理。其他浏览器有更高的URL限制。
因此,在编写应用程序时我对Apache服务器的限制很感兴趣。
Apache服务器中URL的最大长度是多少?它在哪里有记录,并且是否可以配置?
我正在实现一个OpenID身份提供者,并想了解我所面临的限制。我知道Internet Explorer有2048字节路径限制,可以使用用户代理检测进行特殊处理。其他浏览器有更高的URL限制。
因此,在编写应用程序时我对Apache服务器的限制很感兴趣。
默认情况下,请求行的长度限制为8190字节(参见LimitRequestLine
指令)。如果我们从请求方法(即GET
)中减去三个字节,从版本信息(即HTTP/1.0
/HTTP/1.1
)中减去八个字节,并从分隔空格中减去两个字节,我们最终将得到8177个字节的URI路径和查询。
☢
变成 %E2%98%A2
)。 - Piskvor left the building来源: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。
GET请求中URI的默认大小限制为8177个字符。以下是用Python编写的简单测试代码。
#!/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()
当您发送 8178 个字符时,您会收到以下错误信息: HTTP/1.1 414 Request-URI Too Large
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
请求行长度的默认限制为8192个字节 = 8 * 1024。 如果您想更改限制,您需要在Tomcat server.xml中添加或更新maxHttpHeaderSize属性。
如下:
<Connector port="8080" maxHttpHeaderSize="65536" protocol="HTTP/1.1" ... />