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

How to check if value is number in Varnish?

Cookie 字符串示例:

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

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

代码:

if(req.http.Cookie){

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

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

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

       return (pass);
   }

}

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

这将匹配任何数字序列:

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

或者您只能匹配 3 个号码:

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

您可以在 vmod 或内联 C 中执行此操作。这是一个测试 header 值的内联 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, "2X-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 之前,它对于测试很有用。