在NGINX反向代理设置中有效忽略cookie列表

时间:2019-07-11 09:10:05

标签: regex nginx cookies nginx-reverse-proxy nginx-config

我目前正在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;
}
  1. 在此示例中,我注意到正则表达式与 在“ if”块中使用的那些。我不明白为什么模式 开头没有任何“”,直接带有一个符号。

  2. 我不明白 [[:: alnum:]] + 是什么意思?我寻找这个     但是我找不到文档。 (或者我错过了)

  3. 我可以看到作者将“ nil”设置为默认值,这将     不适用于我的情况。

示例2:

map $http_cookie $cache_uid {
  default  '';
  ~SESS[[:alnum:]]+=(?<session_id>[[:graph:]]+)  $session_id;
}
  1. 与示例1中的要点相同,但是这次我可以看到 [[:graph:]] + 。 那是什么?

我的示例(未经测试):

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列表,我可以使用适当的正则表达式绕过缓存。

非常感谢任何建议/示例。

2 个答案:

答案 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