如何检查清漆中的值是否为数字?
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 之前,它对于测试很有用。
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 之前,它对于测试很有用。