清漆变量和DRY代码

时间:2016-05-16 18:47:39

标签: dry varnish-vcl

作为一名python工程师,学会编写DRY样式代码;不是因为它是一个流行语,而是让你的代码更清晰,更容易被其他人阅读。

任何读过前同事代码的人都能理解这一点。

使用清漆,没有变量赋值,那么如何才能尝试编写DRY样式规则?

请考虑以下事项:

我有一个后端实例集群,运行apache超过10 vhosts。需要根据vhost重新编写前端实例。

我坚持这个:

if ( req.url ~ "^/amp/" ) {
    # vhost's AMP code == xyz
    if (req.http.host = "host1.com") {
       set req.url = regsub(req.url, "/amp/",  "/nps/$host1-brand-code/");
    }
     if (req.http.host = "host2.com") {
       set req.url = regsub(req.url, "/amp/",  "/nps/$host2-brand-code/");
    }
    ...
}

这里令人沮丧的是重复regsub

"/nps/$host1-brand-code/"

如果发布商决定将下个月更改为/new-nps-url/$host1-brand-code,该怎么办?我将被迫为一个集群更新许多if语句,并且我们有许多集群!

1 个答案:

答案 0 :(得分:1)

因此,如果您不想使用VMOD的路径(尽管@ cory-shay建议的Index vmod是一个很好的选项),那么一个选项是使用自定义子例程然后使用HTTP像在Python中一样传递参数的变量。

在你的情况下:

var

这可以让你在理论上用品牌代码做多件事。但是如果你只是做一次替换,你可以将sub ourcompany_amp_code { set req.url = rebsub(req.url, "/amp/", "/nps/" + req.http.BRAND_CODE); // Cleanup so it does not get passed to upstream // Though the "_" in the name will generally prevent that // in any case unset req.http.BRAND_CODE; } sub vcl_recv { if (req.http.host = "host1.com") { set req.http.BRAND_CODE = "$host1-brand-code"; } else if (req.http.host = "host2.com") { set req.http.BRAND_CODE = "$host2-brand-code"; } call ourcompany_amp_code; } 的主体移动到你的一系列if语句之后。

使用ourcompany_amp_code vmod,您只需将var的使用替换为req.http.BRAND_CODE