我该如何处理非常长的URL?

时间:2014-12-14 02:45:51

标签: php http

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

因为它是带有过滤器的搜索表单,所以生成的URL的长度和排序等都是不可预测的。我担心URL可能超出长度限制的边缘情况。可能的解决方案是实际POST数据,然后根据该数据生成唯一的哈希值,然后使用它作为搜索的URL。这个解决方案确实需要将实际的表单数据保存到数据库,例如,然后在每个搜索请求上重新查询它,这似乎是浪费。

我想知道我还有其他想法吗?

编辑:我想在这里感谢你的所有答案,他们帮了很多忙。我将在下面总结我为解决这个问题所做的工作,希望它可以帮助其他人:

  1. 正如所指出的,如果URL太长(超过2000个字符),那么也许我做错了。所以我回过头来重新访问我的算法,并设法通过GET字符串切换了我所拥有的信息的一半以上(之前,它可以很容易地超过500个字符让我担心)
  2. 我也把我的字符串弄糊涂了。原因是深层嵌套数组在查询字符串上不能很好地工作,并且通过jsonifying数组我实际上得到了一个更短更容易阅读的结果
  3. 还有另一种解决方案,就是编写自己的解析器,例如,如果你想得到更短的网址,你可以写:category = 1,2,3,4,5,因为你已经知道了你的查询结构你可以在你的后端进行解析。这需要更多的工作,所以我还没有尝试过,直到我真的必须
  4. 我还没有尝试过哈希/令牌路线,但我相信如果你真的需要处理巨大的输入,它也是一个很好的解决方案。您可以POST输入,然后发回哈希字符串标记以用作搜索URL。

1 个答案:

答案 0 :(得分:3)

首先,根据this Stack Overflow answer,你可以直到2000个字符 1

一旦达到这个限制,如果你想保持你的网址可分享,你可以看到几个选择:

  1. 正如您所建议的那样,使用POST请求来存储实际查询并将其与散列相关联,然后使用后续GET请求来运行查询并检索结果。
  2. 压缩查询字符串clientside并将其解压缩到服务器端。
  3. 让我们考虑这些方法的相对优点。

    赞成哈希...

    • 您可以将URL保持任意小(并且具有固定长度,例如12或16个字符),而如果您采用压缩路径,则可能会导致更长(并因此更丑)的URL。< / LI>
    • 您的搜索可能会变得任意长 - 如果出于某些不正当的原因,您可能需要这些文档才能成为千篇文章。 (你可能不会。)
    • 您可以使用hash轻松地在PHP中执行此操作,而使用压缩方法的工具则不太明显。

    赞成压缩...

    • 性能。每当用户进行搜索时,散列方法都需要向服务器发出两个请求,这不可避免地会对用户可见的性能产生影响,因为您需要支付每次搜索到服务器额外往返的延迟成本。 (好吧,如果您在客户端上进行哈希并且在知道它是否存储之前推测性地尝试使用计算的哈希值进行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