【问题标题】:Varnish Sort Querystring ParameterVarnish 排序查询字符串参数
【发布时间】:2012-01-11 17:55:10
【问题描述】:

我有很多避免缓存的请求,因为它们的所有列表排列都已列出,即:

http://.....&var=a,b,c
http://.....&var=a,c,b
http://.....&var=b,a,c
http://.....&var=b,c,a
http://.....&var=c,a,b
http://.....&var=c,b,a

有没有一种聪明的方法可以将这些散列到相同的值?在查询字符串值的排序版本中是最简单的方法吗?

【问题讨论】:

  • 为什么不确保在显示 URL 时始终按固定顺序生成参数?
  • @Oli 是外部API,我们不控制参数。
  • 在其他条件相同的情况下,我肯定更喜欢 URL 的规范版本,而不是使用哈希,这意味着对它们进行排序。当然假设响应确实是相同的,例如它不包括 url 本身。清漆本身是否大量使用哈希?如果是这样,那么也许您应该在 url 上定义一个散列函数,将列表的组件分开,然后使用一些交换运算符(如加法)组合它们的散列,以给出整个 URL 的散列。
  • @Steve 这显然是一种合理的方法。我真的在这里寻找特定于 Varnish 的东西,因为一般的解决方案非常简单。添加哈希似乎确实比排序更好。
  • 像加法这样的简单运算符的问题是,虽然它会碰撞“3,4,5”和“4,3,5”,但它也会碰撞“2,4,6”。 ..

标签: c varnish


【解决方案1】:

我为 Varnish 编写了一个模块,它按字母顺序重新排列查询参数。

附有解释的博文:
http://cyberroadie.wordpress.com/2012/01/05/varnish-reordering-query-string/

代码可以在这里找到: https://github.com/cyberroadie/varnish-urlsort

【讨论】:

  • 干得好!不过有一个挑剔:strok 不是线程安全的(一开始我不得不努力解决这个问题)。
  • 另外,你可能想释放一些内存 :)
  • 这两个问题都已修复,线程安全且内存已释放。我还对代码进行了一些重新排序并进行了清理。
  • 看起来不错!我看到你也提交了 Varnish 列表,很棒的工作贡献者!
【解决方案2】:

“将您的网址重写为规范形式,然后对其进行哈希处理”。这说起来容易做起来难,因为 vcl 没有参数处理的操作(除了正则表达式匹配)。您需要一些内联 C 来为您进行处理,或者使用 varnish 前面的其他代理/负载均衡器(如果有的话)来重写您的请求(如 ngingx)。

【讨论】:

  • 最终编写了内联 C 来对两个查询字符串参数进行排序(即“c=x&a=x&b=x”->“a=x&b=x&c=x”,以及适用的逗号分隔字段即“vals=c,a,b”->“vals=a,b,c”)。把你的功劳作为唯一的答案;)。
  • 你能贴出你写的用于排序查询字符串的内联C吗?
  • @Cyber​​roadie 完全希望我可以,但鉴于它是实时的(并且它已链接到 Varnish),我认为我的组织不会允许它。对不起。
  • 不用担心,只是想知道您是否为此使用 库?是否可以使用内联 c #include ?还是你自己写了一个 url 解析器?
  • @Cyber​​roadie 不,实际上我自己编写了解析器(尽管使用库可能更有意义)。我是'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 2021-01-05
相关资源
最近更新 更多