5

我有一个 JavaScript 小部件,它通过在 DOM 中创建标签与我的 Rails 应用程序进行通信。每隔一段时间,我就会在我的服务器日志中看到一个格式错误的请求,其中 URL 被截断为 255 个字符:

http://myapplication.example/mycontroller/1/myaction?hostname=www.mycustomer.example&request[param_a]=3&request[param_b]=1&request[param_c]=0&request[param_d]=0&request[param_e]=3&request[param_f]=1&request[param_g]=4&request[param_h]=0&request[param_i]=5&request

从 Google 和 Stackoverflow(不同浏览器中 URL 的最大长度是多少?),看起来 255 个字符不是 URL 的有效限制。

这是我所知道的:

  • 这是一个零星的问题,它不会发生在所有请求上
  • 发生这种情况时,URL 会被截断为 255 个字符
  • 发生此错误时,用户代理不会记录在回溯中

这是我不知道的:

  • 什么类型的浏览器会出现此错误?也许一些移动浏览器...

解决此问题的最佳方法是什么?

4

3 回答 3

3

解决根本原因的最佳方法是不将其设为 GET 而是设为 POST 请求。

AFAIK 对 QueryString 的长度没有设定限制,因此真正的限制无处不在。我知道 4000 是某些 Web 服务器的限制(不记得是 IIS 还是 Apache 以及是否可以更改),但很可能某些浏览器的限制要小得多。您没有获得用户代理这一事实可能会强调它是移动浏览器、爬虫或其他应用程序,而不是真正的浏览器。

POST 请求执行起来有点复杂,但它们可以携带更大的“有效负载”并且可以在服务器端进行配置。

于 2010-03-04T18:44:59.803 回答
2

我不确定为什么会发生这种情况,RFC 2068指出:

服务器应谨慎使用超过 255 字节的 URI 长度,因为一些较旧的客户端或代理实现可能无法正确支持这些长度。

可能是服务器错误地处理了长 GET 参数,或者可能是较旧的浏览器(可能是 IE6)在发送它们之前截断了参数,希望它可以避免服务器的失败请求。

但是,任何浏览器或服务器(我知道)中的 POST 请求长度都没有限制,因此这可能是一个有保证的工作解决方案。

编辑: 此链接指出某些浏览器确实对查询字符串长度施加了限制,但它们似乎都相当长。也许移动浏览器将长度限制为 ~255 以节省内存,因为它的数量更有限。

于 2010-03-04T18:46:24.647 回答
0

我已经在我的访问日志中看到了这种情况。有一些非常特定的 IP 会生成截断的请求。查看来自这些 IP 的所有流量表明还有未截断的请求,其中包含用户代理字符串。其中一些有多个用户代理字符串(尽管我没有看到超过 2 个唯一字符串——Safari 5.0.5/Mac 10.6.8 和 IE 9.0/NT 6.1)在几分钟内出现。此外,除了 2 种情况外,我在大约 50 毫秒后看到一个好请求,然后是一个坏请求,其中坏请求与好请求相同,但在 255 字节处被截断。其余 2 例在好请求之前有坏请求。其中一个 IP 来自 AT&T Worldnet,暗示它可能是一个移动网关,但其他 IP 似乎只是 ISP、大学或公司。

我不知道我能从中看出什么。Safari 5 和 IE 9 从同一个 IP 出现的可能性很小。这三种可能性是 Mac OSX 上的 Windows VM,IP 是网关,两个不同的用户通过它发出请求,或者有人在惹我。尽管只有两个用户通过网关,这似乎有点奇怪,而且这个特定站点的访问者人口统计不太可能运行虚拟机(尽管这并非不可能),至少对于这个特定任务来说不是。

被截断的请求紧跟在未截断的请求之后的事实可能暗示了一些事情,但我不知道那是什么。是插件重放请求还是 NAT 重放请求?透明代理?

于 2012-04-03T15:44:21.857 回答