Apache的最大URL长度是多少?

65

Apache服务器中URL的最大长度是多少?它在哪里有记录,并且是否可以配置?

我正在实现一个OpenID身份提供者,并想了解我所面临的限制。我知道Internet Explorer有2048字节路径限制,可以使用用户代理检测进行特殊处理。其他浏览器有更高的URL限制。

因此,在编写应用程序时我对Apache服务器的限制很感兴趣。


重复:https://dev59.com/XHRC5IYBdhLWcg3wFM_W - S.Lott
6
非复制。但是S.Lott提供的参考资料很有用。OP正在询问特定服务器的限制。 - maxwellb
6个回答

75

默认情况下,请求行的长度限制为8190字节(参见LimitRequestLine指令)。如果我们从请求方法(即GET)中减去三个字节,从版本信息(即HTTP/1.0/HTTP/1.1)中减去八个字节,并从分隔空格中减去两个字节,我们最终将得到8177个字节的URI路径和查询。


7
没错,我已经用Apache 2.2.11测试过了,调整LimitRequestLine参数是有效的。为了好玩,我已经成功地使用它处理了128K大小的URL。 - Stef
3
你是否需要重新编译才能使用这么大的值?我的版本(2.2.15)会在没有重新编译并添加CFLAG“-D DEFAULT_LIMIT_REQUEST_LINE=16384”时,悄无声息地忽略超过8190的LimitRequestLine指令(然后它允许达到16384)。 - sh-beta
4
请注意这是“字节”限制;由于url编码的多字节字符,很容易达到此限制(因为n个字节的字符需要n * 3个字节: 变成 %E2%98%A2)。 - Piskvor left the building
1
同样忽略了2.2.22指令。 - chishaku

18
  • Internet Explorer: URL路径部分不超过2,048个字符,整个URL最多2,083个字符
  • Firefox: 可显示65,536个字符,但长于此的URL仍然可用,甚至可以超过100,000个字符
  • Safari: > 80,000个字符
  • Opera: > 190,000个字符
  • IIS: 默认为16,384个字符,但可进行配置
  • Apache: 4,000个字符

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


4
链接已失效。 - Starx
4
或者是吗?https://web.archive.org/web/20120330062735/http://www.danrigsby.com:80/blog/index.php/2008/06/17/rest-and-max-url-size - Sam Denty

7

根据官方Apache文档,正式长度为8,192,但许多人在大约4,000处遇到了麻烦。

不过,通常限制因素是MS Internet Explorer,它将最大URL大小限制在2,048。


5

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


3
这是默认长度,可以使用LimitRequestLine配置指令进行更改。 - Stef

3
这是一个使用curl和perl检查远程服务器最大限制的Bash脚本。
你只需要提供一个可以通过添加 '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

-2

请求行长度的默认限制为8192个字节 = 8 * 1024。 如果您想更改限制,您需要在Tomcat server.xml中添加或更新maxHttpHeaderSize属性。

如下:

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

在这个例子中,我将限制设置为65536字节= 64 * 1024。
希望这能有所帮助。

1
问题是关于Apache而不是Tomcat。 - Valerio Bozz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接