【问题标题】:How should I handle very very long URL?我应该如何处理非常长的 URL?
【发布时间】:2015-02-12 11:24:08
【问题描述】:

我想知道这是否是一个错误,但现在我对所有搜索 URL 都使用了 GET。原因是使用 GET Url 用户可以简单地复制地址栏上的链接并轻松共享或保存。例如,Google 似乎也使用 GET Url(表单)。

由于它是一个带有过滤器、排序器的搜索表单,因此生成的 URL 的长度可能无法预测。我担心 URL 可能超过长度限制的边缘情况。可能的解决方案是实际发布数据,然后根据该数据生成唯一的哈希,然后将其用作搜索的 URL。例如,此解决方案确实需要将实际表单数据保存到数据库中,然后在每次搜索请求时重新查询它,这似乎很浪费。

不知道有没有其他的方法我还没有想到?

编辑:我想在这里感谢您的所有回答,他们帮助很大。我将在下面总结我为解决此问题所做的工作,希望对其他人有所帮助:

  1. 正如所指出的,如果 URL 太长(超过 2000 个字符),那么我可能做错了什么。所以我回去重新审视了我的算法,并设法将我必须通过 GET 字符串传递的信息减少了一半以上(以前,它很容易得到超过 500 个字符,这让我很担心)
  2. 我还对我的字符串进行了json化。原因是深层嵌套数组在查询字符串上效果不佳,通过对数组进行 json 化,我实际上得到了一个更短且更易于阅读的结果
  3. 还有另一种解决方案,即编写您自己的解析器,例如,如果您想获得更短的 url,您可以编写:category=1,2,3,4,5 并且您已经知道您的查询结构您可以在后端进行解析。这需要更多的工作,所以我还没有尝试过,直到我真的不得不这样做
  4. 我还没有尝试过散列/令牌路由,但我相信如果你真的必须处理大量输入,它也是一个很好的解决方案。您可以发布输入,然后发回哈希字符串令牌以用作搜索 URL。

【问题讨论】:

  • HTTP 协议中没有设置“最大”长度,但是浏览器有一些限制。但是,这些数字确实很大,我不会担心。有关 url 长度的更多信息可以在这里找到:boutell.com/newfaq/misc/urllength.html
  • 如果您不需要用于 GET 的数据库,您将不需要用于 POST 的数据库。为什么不将这些数据存储在会话中?
  • @Jonast92 谢谢,我搜索的时候没发现,我看看有没有好的解决方案,然后关闭这个问题
  • @SpencerWieczorek 在会话中保存 url 意味着用户无法共享 url,这在我的特定情况下是不可取的。
  • @Jonast92 'duplicate' 冗长乏味,并且接受的答案是使用 POST 请求而不是 GET 的方法,这里的提问者给出了想要避免的充分理由。我投票保持开放。

标签: php http


【解决方案1】:

首先,根据this Stack Overflow answer,您最多可以输入 2000 个字符1

一旦你达到了这个限制,如果你想让你的 URL 保持可共享,我可以看到你有几个选择:

  1. 按照您的建议,使用 POST 请求存储实际查询并将其与哈希关联,然后使用后续 GET 请求运行查询并检索结果。
  2. 在客户端压缩查询字符串并在服务器端解压缩。

让我们考虑一下这些方法的相对优点。

赞成散列...

  • 您可以将 URL 保持在任意小(并且具有固定长度,例如 12 或 16 个字符),而如果您采用压缩路径,您最终可能会得到更长(因此更丑)的 URL。
  • 您的搜索可能会变得任意长 - 如果出于某些不正当的原因需要它们,它们可能是数千页的巨大文档。 (你可能不知道。)
  • 您可以在 PHP 中使用 hash 轻松地做到这一点,但对于压缩方法使用哪些工具不太明显。

赞成压缩...

  • 性能。每当用户进行搜索时,散列方法都需要向服务器发出两次请求,这不可避免地会对用户产生可见的性能影响,因为每次搜索都要支付额外往返服务器的延迟成本。 (好的,如果您在客户端散列并推测性地尝试使用计算出的散列的 GET,然后才知道它是否已存储,那么您可以将其减少到 1 个请求,以获取某人之前执行过的搜索,但这样做的代价是新搜索需要 3 个请求。)
  • 您不需要在任何地方存储哈希到查询的映射。根据您的具体情况,当表有数亿行时,将它们放入数据库可能是性能陷阱或磁盘使用问题。

根据您的具体情况,其中一些因素可能与您无关;我让你来权衡你的优先事项。

如果你想走压缩路线,我不知道有什么工具可以推荐给你。 How to compress URL parameters 可能是一个开始寻找的好地方。或许也可以考虑https://github.com/pieroxy/lz-string压缩,https://github.com/nullpunkt/lz-string-php解压。


1 请注意,2000 个字符的 URL 相当长。你的网址真的这么长吗?

https://www.google.com/search?as_q=you+have+to+write+a+really+really+long+search+to+get+to+2000+characters.+like+seriously%2C+you+have+no+idea+how+long+it+has+to+be&as_epq=2000+characters+is+absolutely+freaking+enormous.+You+can+fit+sooooooooooooooooooooooooooooooooo+much+data+into+2000+characters.+My+hands+are+getting+tired+typing+this+many+characters.+I+didn%27t+even+realise+how+long+it+was+going+to+take+to+type+them+all.&as_oq=Argh!+So+many+characters.+I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.+I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.I%27m+bored+now%2C+so+I%27ll+just+copy+and+paste.&as_eq=It+has+to+be+freaking+enormously+freaking+enormous&as_nlo=123&as_nhi=456&lr=lang_hu&cr=countryAD&as_qdr=m&as_sitesearch=stackoverflow.com&as_occt=title&safe=active&tbs=rl%3A1%2Crls%3A0&as_filetype=xls&as_rights=(cc_publicdomain%7Ccc_attribute%7Ccc_sharealike%7Ccc_nonderived).-(cc_noncommercial)&gws_rd=ssl

【讨论】:

  • 我已经到了我的搜索必须在 URL 中表示的地步,这样用户基本上可以将相同的代码复制粘贴给其他人。问题是我们有类别(很像 Ebay 上的类别),但我们允许用户使用复选框选择它们,这样您就可以创建一个包含 +4k 字符的链接。当(我认为)无法展平搜索时,您将如何处理它。
  • 我有同样的问题,决定使用多部分 POST 请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 2021-04-01
  • 1970-01-01
  • 2010-09-13
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多