如何在 zalando 的 skipper-filter 中使用正则表达式将可选 cookie 列入白名单

How to whitelist an optional cookie using regex in skipper-filter of zalando

我想使用正则表达式修改 Cookie RequestHeader,以防止向服务器发送过多的 cookie,因为服务器只会丢弃太大的 header 请求。但是,我不想丢掉所有的 cookie,因为我仍然没有 'authorization' cookie。也就是说,并非所有请求都包含 'authorization' cookie。

# example cookie A:
foo=bar;authorization=jwt;more=bla
#example cookie B:
foo=bar;more=bla

使用 zalando 的船长过滤器,我可以像这样修改请求 header:

zalando.org/skipper-filter: modRequestHeader("Cookie", "^(.*)(authorization=.[^;]+;)(.*)$", "")

这在 A 的情况下有效,但在 B 的情况下无效,因为那时我将获得所有 cookie 而不是 NONE。

那么我该如何修改正则表达式以使其在这两种情况下都能正常工作?

编辑: 谢谢@Wiktor

我最终得到了这个可行的解决方案,因为单个 cookie 不需要尾随分号:

zalando.org/skipper-filter: modRequestHeader("Cookie", "^(?:(.*)(authorization=[^;]+)(.*)|.+)$", "")

擦除不匹配的字符串的最简单方法是添加 .+ 替代方法:

^(?:(.*)(authorization=[^;]+;)(.*)|.+)$

参见 regex demo详情:

  • ^ - 字符串开头
  • (?: - 非捕获组的开始:
    • (.*) - 第 1 组:除换行字符外的任何零个或多个字符,尽可能多
    • (authorization=[^;]+;) - 第 2 组:authorization= 字符串和除 ; 之外的一个或多个字符,然后是 ;
    • (.*) - 第 3 组:除换行字符外的任何零个或多个字符,尽可能多 -| - 或
    • .+ - 除换行字符外的任何一个或多个字符,尽可能多
  • ) - 非捕获组结束
  • $ - 字符串结尾。

另一种方法是匹配可选组中的 authorization 部分,使第一个点模式变得惰性:

^(.*?)(?:(authorization=[^;]+;)(.*))?$

参见 this regex demo。由于整个不匹配的字符串将落入第 1 组,替换为 </code> 仍将产生空输出。</p> <p><em>详情</em>:</p> <ul> <li><code>(.*?) - 第 1 组:除换行字符外的任何零个或多个字符尽可能少

  • (?:(authorization=[^;]+;)(.*))? - 一个可选的非捕获组
    • (authorization=[^;]+;) - 第 2 组:authorization=,一个或多个非分号和一个 ; 字符
    • (.*) - 第 3 组:除换行字符外的任何零个或多个字符尽可能多
  • 如果您不需要访问第 3 组值,请删除最后一个 .* 的括号。