使用 Varnish 重写 URL

使用 Varnish 重写 URL

我有一个相对简单的用例(我认为),但我找不到任何人这样做的例子。我们在两个不同的应用程序前面使用 Varnish 作为缓存和反向代理,并且希望使两者之间的事情更加统一,因为它们都做类似的事情。我希望 Varnish 可以帮助重写 URL,如下所示。

原始应用程序 URL 用于分页(获取前 10 个项目):

//myapplication.com/products/?startindex=1&endindex=10 所需 URL:

//myapplication.com/products/?paginate=1:10 这只是一个例子(最复杂,因为它结合了两个参数),但在所有情况下,参数的输入值保持不变,只是参数名称会改变。

另一个例子是:

//myapplication.com/search/?query=something 到:

//myapplication.com/search/?q=something 有人有使用清漆的经验吗?以及如何做到这一点?

谢谢

答案1

如果您想内部重写 URL,请将以下内容(未经测试)放入 vcl_recv 中:

set req.url = regsub(
    req.url,
    "^/products/.*([&?]startindex=([0-9]+)|[&?]endindex=([0-9]+))*",
    "/products/?paginate=\2:\3"
);

如果您想要将 301 请求从一种 URL 样式转换为另一种 URL 样式,那么它会稍微复杂一些,但是这里有一个粗略的入门方法:

接收端:

set req.http.X-Redirect-URL = regsub(
    req.url,
    "^/products/.*([&?]startindex=([0-9]+)|[&?]endindex=([0-9]+))*",
    "/products/?paginate=\2:\3"
);
error 700 req.http.X-Redirect-URL;

错误原因:

if (obj.status == 700) {
    set obj.http.Location = obj.response;
    set obj.status = 301;
    set obj.response = "Moved Permanently";
}

显然,如果您有其他参数,您将必须经过更多的步骤来确保它们能够正确传递。

相关内容