URL被截断为255个字符

时间:2010-03-04 18:37:46

标签: javascript ruby-on-rails url truncate

我有一个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(What is the maximum length of a URL in different browsers?),看起来255个字符不是对网址的有效限制。

以下是我所知道的:

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

这是我不知道的:

  • 此错误发生在哪些类型的浏览器上?也许是一些移动浏览器......

导致此问题的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

  

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

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

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

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

答案 2 :(得分:0)

我在访问日志中看到过这种情况。有一些非常具体的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,表明它可能是一个移动网关,但其他IP似乎是ISP,大学或公司。

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

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