【问题标题】:Get url value from varnish从 varnish 中获取 url 值
【发布时间】:2013-03-05 03:23:13
【问题描述】:

我想从 varnish 中的 url 中去除值,因此我可以根据 url 采取不同的操作,例如:

网址:/product/123/price/available。

我想将其转换为 /products?id=123&sort=price&available=true

我还希望能够(如果可能的话)在请求标头上设置值,因此我可以执行以下操作,而不是传递 URL 上的所有参数:

/products?id=123&sort=price

  • 带有标题:x-show-available-only: true

我很欣赏第二个例子看起来有点奇怪,但这样我们可以将新参数传回我们的旧应用程序,并确保没有任何新参数干扰当前参数 - 我们只需通过标题读取新参数,直到我们将所有功能迁移到我们的新平台。

我确定这是一个正则表达式,但不知道该怎么做。

【问题讨论】:

  • 在发布答案之前,我是否正确地认为正在从一个应用程序(使用旧的 url 方案)转移到一个新的应用程序(使用新方案),并且这两个应用程序都将运行一边- 并排一会儿?您是否要在两个应用程序中生成新的 URL 方案,但将访问旧应用程序的 URL 的请求重写为旧格式?
  • 是的,这很准确!我们将立即引入一些新功能,然后在新功能可用时迁移部分应用程序。
  • 因此 - stage1,旧网址和新网址,都转到新旧应用程序。第 2 阶段,一旦从应用程序中删除所有对旧网址的引用,我们将为旧网址(用于书签、链接等)实施重定向。第 3 阶段,一旦完全迁移到新应用程序,我们将不再使用旧的 url 架构,我们将删除所有重写规则。我希望这能让它更清楚。谢谢

标签: regex url rest varnish legacy


【解决方案1】:

这未经测试,但应该足够接近,您可以对其进行调整以使其正确。

根据您的网址:

/product/123/price/available

您需要指定两个后端(更改您自己的 IP):

backend old_app {
    .host = "127.0.0.1";
    .port = "80";
}

backend new_app {
    .host = "127.0.0.2";
    .port = "80";
}

以及你的 vcl_recv 中的代码:

if (req.url ~ "^/product/") {
    set req.url = regsub(req.url, "/product/([0-9]/)/([a-zA-Z])", "/products?id=\1&sort=\2");
    set req.backend = old_app;
} else {
    set req.backend = new_app.
}

if (req.url ~ "/available") {
    set req.http.x-show-available-only = "true";
}

您可以添加更多的正则表达式规则作为 if/else 块。

祝你好运!

【讨论】:

  • 谢谢,这真的很有帮助:)
  • 如果答案是正确的,请您标记为正确吗?谢谢! :-)
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2012-03-28
  • 2016-09-23
  • 2012-02-01
  • 1970-01-01
相关资源
最近更新 更多