如何在 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 组值,请删除最后一个 .*
的括号。
我想使用正则表达式修改 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 组值,请删除最后一个 .*
的括号。