【问题标题】:URL getting truncated at 255 charactersURL 被截断为 255 个字符
【发布时间】:2010-03-04 18:37:46
【问题描述】:

我有一个 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 的有效限制。

这是我所知道的:

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

以下是我不知道的:

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

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

【问题讨论】:

  • 在一些手机浏览器上听说过这个问题;不过,我找不到已确认的限制为 255 个字符的浏览器列表。你能过滤你的访问日志什么时候发生并注意浏览器吗?
  • 由于您没有看到用户代理,您可能会看到蜘蛛或网络机器人,它们通常对它们可以处理的 url 长度有限制

标签: javascript ruby-on-rails url truncate


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我在访问日志中看到了这种情况。有一些非常特定的 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 重放请求?透明代理?

      【讨论】:

        猜你喜欢
        • 2017-09-05
        • 1970-01-01
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        相关资源
        最近更新 更多