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

Posted

技术标签:

【中文标题】在 NGINX 反向代理设置中有效地忽略 cookie 列表【英文标题】:Ignoring cookies list efficiently in NGINX reverse proxy setup 【发布时间】:2019-11-20 23:03:34 【问题描述】:

我目前正在 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 方法来完成?我看到地图中的正则表达式不同(或者我错了)。

或者还有其他方法可以有效地忽略/绕过 cookie 吗?

我在***上搜索了很多,虽然有很多不同的例子;我找不到适合我需要的东西。

谢谢

更新:

在互联网上大量阅读和“挖掘”(我们不妨说谷歌),我发现了一些有趣的例子。

但是我对这些很困惑,因为我不完全了解正则表达式的用法,而且我害怕在不理解的情况下实施。

示例 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;

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

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

【问题讨论】:

那么,如果发现任何这些 cookie,或者您想删除对 cookie 的篡改,您想绕过缓存吗? @TarunLalwani - 是的,如果满足这些 cookie,我想绕过缓存。否则微缓存会导致可怕的问题,人们会登录并看到其他人的帐户和数据。 感谢所有的鱼,+1! 【参考方案1】:

你到底想做什么?

您的做法是通过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 请求标头以避免缓存中毒问题也可能有意义。

【讨论】:

感谢您的清晰解释,我的最终目的是忽略微缓存中的所有 cookie。我不知道“proxy_no_cache $http_cookie;”实际上会起作用并忽略所有cookie吗?这是正确的吗? 另外,我真的看不出为什么要缓存“一些”cookie 的原因。我不明白为什么所有教程和文章都显示如何只忽略微缓存中的特定 cookie。 . @NorbertBoros 如果用户已登录,为什么没有用户特定的缓存?或者如果没有充分的理由使用 cookie — 例如,我从 BXR.SU 上的 OpenGrok 中删除 cookie,并缓存每个响应;见***.com/a/45359481/1122270。至于proxy_no_cache $http_cookie;,是的,我认为这正是你想要的,然后——见nginx.org/r/proxy_no_cache,文档很清楚——“如果字符串参数的至少一个值不为空并且是不等于“0”则不保存响应”。 :-) @NorbertBoros,好吧,你得知道你在缓存什么;如果都是静态资源,那就静态服务,不需要缓存;如果它是动态内容,很可能涉及到 cookie,然后你就不能真正缓存它而不引入问题。【参考方案2】:

你所拥有的第二个例子就是你真正需要的

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 可以绕过缓存

【讨论】:

但是在互联网上确实没有在地图中使用这种正则表达式样式 [a-zA-Z0-9_]+ 的示例?你确定吗? 基本上它是一个正则表达式模式,人们只使用需要的东西,在大多数情况下,他们想要一个包含某些东西的值,而不是一个非常具体的东西,它必须是数字或其他东西 而且还有不同的用途,比如看这个帖子serverfault.com/questions/482372/… 感谢您的回答,但我知道这是一个正则表达式模式......我的问题是不同的。为什么没有人在 map 指令中使用 [a-zA-Z0-9_]+ 样式,[[:alnum:]]+ 有什么区别? 有相同的,但:alnum: 是提供正则表达式的 POSIX 方式。 regular-expressions.info/posixbrackets.html。我从未在 nginx 中使用过 POSIX 的,我通常更喜欢仅使用 [a-zA-Z0-9_]+

以上是关于在 NGINX 反向代理设置中有效地忽略 cookie 列表的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 如何设置反向代理

nginx启动忽略dns解析

设置好 NGINX 反向代理后,如何在引入 NGINX 反向代理的 NGINX 上配置 SSL 直通? [复制]

uniapp之h5反向代理设置踩坑,解决跨域问题

Nginx反向代理常用配置

反向代理Nginx 精华一页纸