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);
}
}
答案 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之前测试它会很有用。