如何检查Varnish中的值是否为数字?

时间:2015-12-19 14:23:02

标签: caching cookies varnish varnish-vcl

Cookie字符串示例:

session=9urt2jipvkq77brfrf; MyId=124 ; PageId=134

我正在使用Varnish 4.1版。在以下代码中,我从cookie字符串中提取MyId(124)和PageId(134)的值,然后检查值是否相同。如果是,请返回pass并且不提供缓存内容。问题是,匿名访问者除非他们注册,否则不会有这两个cookie,并且它会意外地传递条件而不是缓存,因为这两个值将使用session=9urt2jipvkq77brfrf函数返回相同的值regsub 。我想确保两个值都是完全数字。有什么功能方便吗?

代码:

if(req.http.Cookie){

   set req.http.MyId = regsub(req.http.Cookie,".*MyId=(\d+).*","\1");

   set req.http.PageId = regsub(req.http.Cookie,".*PageId=(\d+).*","\1");

   if(req.http.MyId == req.http.PageId){

       return (pass);
   }

}

2 个答案:

答案 0 :(得分:1)

没有像“is_integer”或类似的方便的功能。但你可以用正则表达式来检查它。

这将匹配任何数字序列:

req.http.MyId ~ "[0-9]+"

或者您只能匹配3个数字:

req.http.MyId ~ "[0-9][0-9][0-9]"

答案 1 :(得分:1)

您可以在vmod或inline C中执行此操作。以下是测试标头值的内联C示例:

sub vcl_backend_response
{
    // Check some value from your backend server response
    if (beresp.http.X-MyCustom-Header)
    {
      C{
        syslog(LOG_ERR, "Received a X-MyCustom-Header");
        char *val_to_test;
        const struct gethdr_s hdr = { HDR_BERESP, "\022X-MyCustom-Header:" };
        val_to_test = VRT_GetHdr(ctx, &hdr);
        int val_int = atoi(val_to_test);  // or whatever C functions
        syslog(LOG_ERR, "My int value was: %d", val_int);
      }C
   }

   ...
}

通常你会将所有内联C打包成一个vmod,让你的生活更轻松,但在转移到vmod之前测试它会很有用。