我目前正在NGINX反向代理设置中为动态内容工作/测试微缓存功能。
发生的一个大问题是需要忽略的会话/ cookie,否则人们将使用该站点上的随机帐户登录。
当前,我忽略了这样的流行CMS cookie:
if ($http_cookie ~* "(joomla_[a-zA-Z0-9_]+|userID|wordpress_(?!test_)[a-zA-Z0-9_]+|wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+|comment_author_[a-zA-Z0-9_]+|woocommerce_cart_hash|woocommerce_items_in_cart|wp_woocommerce_session_[a-zA-Z0-9]+|sid_customer_|sid_admin_|PrestaShop-[a-zA-Z0-9]+")
{
# set ignore variable to 1
# later used in:
# proxy_no_cache $IGNORE_VARIABLE;
# proxy_cache_bypass $IGNORE_VARIABLE;
# makes sense ?
}
但是,如果我想向忽略列表添加更多cookie,这将成为一个问题。更不用说根据文档,不建议在NGINX中使用过多的“ if”语句。
我的问题是,是否可以使用map方法完成此操作?我看到map中的正则表达式不同(或者我错了)。
或者还有另一种有效地忽略/绕过cookie的方法吗?
我在stackoverflow上进行了大量搜索,尽管有许多不同的示例;我找不到适合自己需要的东西。
谢谢
更新:
在互联网上可以进行很多阅读和“挖掘”(我们不妨说Google),我发现了很多有趣的例子。
但是我对此感到非常困惑,因为我不完全理解 regex用法,而且我害怕在不理解的情况下实现这种用法。
示例1:
map $http_cookie $cache_uid {
default nil;
~SESS[[:alnum:]]+=(?<session_id>[[:alnum:]]+) $session_id;
}
在此示例中,我注意到正则表达式与 在“ if”块中使用的那些。我不明白为什么模式 开头没有任何“”,直接带有一个〜符号。
我不明白 [[:: alnum:]] + 是什么意思?我寻找这个 但是我找不到文档。 (或者我错过了)
我可以看到作者将“ nil”设置为默认值,这将 不适用于我的情况。
示例2:
map $http_cookie $cache_uid {
default '';
~SESS[[:alnum:]]+=(?<session_id>[[:graph:]]+) $session_id;
}
我的示例(未经测试):
map $http_cookie $bypass_cache {
"~*wordpress_(?!test_)[a-zA-Z0-9_]+" 1;
"~*wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+" 1;
"~*comment_author_[a-zA-Z0-9_]+" 1;
"~*[a-zA-Z0-9]+_session)" 1;
default 0;
}
在我的伪示例中,正则表达式一定是错误的,因为我没有找到任何带有此类正则表达式的地图cookie示例。
再次,我的目标是要有一个地图样式的cookie列表,我可以使用适当的正则表达式绕过缓存。
非常感谢任何建议/示例。
答案 0 :(得分:4)
您到底想做什么?
您尝试通过if ($http_cookie …
仅将某些cookie列入黑名单的做法是错误的方法-这意味着某天某人会发现未列入黑名单的cookie,并且您的后端仍会接受,并导致您将中毒或其他安全问题缓存到线下。
也没有理由使用http://nginx.org/r/map方法来获取单个cookie的值-所有这些都已经可以通过http://nginx.org/r/$cookie_范式获得,从而制作了map
代码用于解析$http_cookie
相当多余和不必要。
您实际上是否要缓存任何cookie?如果不是,为什么不使用proxy_no_cache $http_cookie;
禁止在存在任何cookie时进行缓存?
您可能想做的是首先确定必须缓存的内容以及在什么情况下,然后才使用nginx.conf
这样的编程语言来表达这种逻辑。
例如,一种更好的方法是查看应该始终缓存哪些URL,清除Cookie
标头以确保不可能发生缓存中毒(proxy_set_header Cookie "";
)。否则,如果存在任何cookie,则要么根本不缓存任何内容(proxy_no_cache $http_cookie;
),要么对缓存进行结构化,以便对http://nginx.org/r/proxy_cache_key使用某种身份验证凭据组合;在这种情况下,通过基于白名单的方法手动重建Cookie
请求标头也可能是有意义的,以避免缓存中毒的问题。
答案 1 :(得分:1)
您拥有的第二个示例就是您真正需要的
map $http_cookie $bypass_cache {
"~*wordpress_(?!test_)[a-zA-Z0-9_]+" 1;
"~*wp-postpass|wordpress_logged_in_[a-zA-Z0-9]+" 1;
"~*comment_author_[a-zA-Z0-9_]+" 1;
"~*[a-zA-Z0-9]+_session)" 1;
default 0;
}
基本上,如果正则表达式与其他bypass_cache
匹配,那么您在说1
的值就是0
。
只要您正确设置了模式,它就会起作用。而且只有您可以拥有该列表,因为您只知道绕过缓存的Cookie