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? 一个透明的代理?