URL被截断为255个字符

我有一个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个字符
  • 发生此错误时,用户代理不会记录在回溯中

这是我不知道的:

  • 这种错误发生在什么类型的浏览器上? 也许一些移动浏览器……

根本导致此问题的最佳方法是什么?

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

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

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

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

服务器应该谨慎依赖于高于255字节的URI长度,因为某些较旧的客户端或代理实现可能无法正确支持这些长度。

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

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

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

我在访问日志中看到过这种情况。 有一些非常具体的IP会生成截断的请求。 查看来自这些IP的所有流量,表明还存在非截断请求,其具有用户代理字符串。 他们中的一些有多个用户代理字符串(虽然我没有看到超过2个uniques – Safari 5.0.5 / Mac 10.6.8和IE 9.0 / NT 6.1)显示在几分钟之内。 此外,在除了2种情况之外的所有情况中,我看到一个好的请求,接着是大约50ms之后的错误请求,其中坏请求与良好请求相同,但截断为255字节。 其余2个案例在良好请求之前有错误请求。 其中一个IP来自AT&T Worldnet,表明它可能是一个移动网关,但其他人似乎只是ISP,大学或公司。

我还不知道从中可以看出什么。 它不太可能看到Safari 5和IE 9出现在同一个IP上。 三种可能性是Mac OSX上的Windows VM,IP是一个网关,两个不同的用户通过它提出请求或有人在弄乱我。 虽然您只有两个用户通过网关,但这个特定站点的访问者人群不太可能正在运行虚拟机(虽然这并非不可能),但这至少不适用于此特定任务,这似乎有点奇怪。

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