【问题标题】:Methods of reducing URL size?减小 URL 大小的方法?
【发布时间】:2011-04-09 22:05:27
【问题描述】:

因此,我们有一个非常庞大且复杂的网站,需要在 URL 中放置大量状态信息。大多数时候,这只是桃子,应用程序运行良好。但是,有(越来越多的)URL 长度变得非常长的实例。由于 URL 长度限制,这会在 IE 中导致巨大的问题。

我想知道,人们使用了哪些策略/方法来减少 URL 的长度?具体来说,我只需要减少 URL 中的某些参数,也许不是全部。

过去,我们已经将一些状态数据推送到会话中......但这会降低我们应用程序的可寻址性(这非常重要)。因此,任何可以保持可寻址性的策略都会受到青睐。

谢谢!

编辑:为了回答一些问题并澄清一下,我们的大多数参数都不是问题......但是其中一些是动态生成的,可能会很长。这些参数可以在 URL 中包含任何合法的内容(意味着它们不仅仅是数字或字母,可以是任何东西)。区分大小写可能很重要,也可能无关紧要。

此外,理想情况下,我们可以将这些转换为 POST,但是由于为此需要进行巨大的架构更改,我认为这是不可能的。

【问题讨论】:

  • 我想说,如果您不想将数据推送到会话中,那么您的选择将变得非常有限,并且实际上取决于 URL 包含的信息类型。如果要单独有效,则包含较长的丘吉尔引用的 URL 将难以压缩;一种包含可以缩写的状态信息(例如q 而不是query,固定类别或常量的缩写ID....)可能更容易。

标签: url web-applications architecture


【解决方案1】:

如果您不想将该数据存储在会话范围内,您可以:

  • 将数据作为 POST 参数发送(在隐藏字段中),因此数据将在 HTTP 请求正文而不是 URL 中发送
  • 将数据存储在数据库中并来回传递一个密钥(让您可以访问相应的数据库记录),这会带来很多可扩展性和安全问题。我想这种方法类似于使用会话范围。

【讨论】:

    【解决方案2】:

    我们的大多数参数都不是问题......但是其中一些是动态生成的,可能会很长

    如果您想在 URL 中保留完整的状态信息而不将数据存储在会话中或永久存储在服务器端,我看不到解决此问题的方法。

    您可能使用一些压缩算法节省几个字节,但它会使 URL 不可读,大多数算法对小字符串不是很有效,并且压缩不会产生可预测的结果。

    唯一想到的其他想法是

    • 缩短参数名称(query => q、page=> p...)可能会节省几个字节

    • 如果参数顺序非常静态,使用mod_rewritten目录结构/url/param1/param2/param3可能会节省几个字节,因为您不需要使用参数名称

    • 任何重复的数据可以“缩短”回数字 ID 或更短的标识符(如公司分支机构的地名、产品名称等),保存在内部、全局、永久的查找表中 (@ 987654326@ => 1, Paris => 2...)

    除此之外,我认为在服务器端存储数据,由@Guido 已经建议的随机密钥标识,是唯一真正的方法。好处是你根本没有大小限制:像

    这样的 URL
    example.com/?key=A23H7230sJFC
    

    可以“包含”尽可能多的服务器端信息。

    当然,不利的一面是,为了使这些 URL 可靠地工作,您必须无限期地将数据保存在您的服务器上。这就像拥有自己的小型 URL 缩短服务......这是否是一个有吸引力的选择,将取决于整体情况。

    我觉得差不多了!

    【讨论】:

    • 我实际上倾向于压缩路线......看起来使用 gZip 我可以得到一些从 1400 个字符到 1000 个字符......我将不得不运行更多的测试来制作确定这实际上是值得的。您的其他建议也都很好。
    【解决方案3】:

    当它们确实是可导航参数时,一个很好的选择是将这些参数放入 URL 的第一部分,例如

    http://example.site.com/ViewPerson.xx?PersonID=123 => http://example.site.com/View/Person/123/

    【讨论】:

    • 是的,这是一个非常好的建议......我希望我们在规划我们的网站时会考虑到这一点。避免这些问题会容易得多。考虑到我们的具体情况,这实际上是可能的。谢谢!
    【解决方案4】:

    如果URL中的数据是自动生成的,不是需要时再生成吗?

    信息很少,很难想出一个解决方案,但我会首先研究 RESTful 架构在使用超媒体(即链接)来保持状态方面的作用。 REST in Practice (http://tinyurl.com/287r6wk) 是一本关于这个主题的非常好的书。

    【讨论】:

      【解决方案5】:

      不确定您使用的是什么应用程序。我遇到了同样的问题,我使用了几个解决方案(ASP.NET):

      1. 使用 Server.Transfer 和 HttpContext(.Net 2+ 中的 PreviousPage)来访问包含数据的源页面的公共属性。
      2. 使用 Server.Transfer 以及源页面中的隐藏字段。
      3. 对查询字符串使用压缩。

      【讨论】:

        猜你喜欢
        • 2012-12-17
        • 2011-02-07
        • 2017-12-22
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        相关资源
        最近更新 更多