我想使用正则表达式修改Cookie regex以防止向服务器发送过多的Cookie,因为服务器会简单地在太大的标头上删除请求。但是,我不想删除所有的cookie,因为我仍然需要"授权"cookie。也就是说,并不是所有的请求都包含"授权"cookie。
# example cookie A:
foo=bar;authorization=jwt;more=bla
#example cookie B:
foo=bar;more=bla
使用zalando的skipper过滤器,我可以像这样修改请求头:
zalando.org/skipper-filter: modRequestHeader("Cookie", "^(.*)(authorization=.[^;]+;)(.*)$", "$2")
这将在A的情况下工作,但不是在B的情况下,因为我将得到所有的饼干,而不是NONE。
那么我如何修改正则表达式来修复它在这两种情况下的工作?
编辑:由于@Wiktor
我最终得到了这个有效的解决方案,因为单个cookie不需要后面的分号:
zalando.org/skipper-filter: modRequestHeader("Cookie", "^(?:(.*)(authorization=[^;]+)(.*)|.+)$", "$2")
擦除没有匹配的字符串的最简单方法是添加.+
替代:
^(?:(.*)(authorization=[^;]+;)(.*)|.+)$
参见regex演示。细节:
^
-字符串 起始(?:
-非抓包组开始;(.*)
-组1:除换行符外,任何零或多个字符,尽可能多(authorization=[^;]+;)
-组2:authorization=
字符串,然后是;
以外的一个或多个字符,然后是;
(.*)
-组3:除换行符外的任何零个或多个字符,尽可能多-|
-或.+
-除换行符外的任何一个或多个字符,尽可能多
)
-非捕获组结束$
-字符串结束
另一种方法是在可选的组中匹配authorization
部分,使第一个点图案变懒:
^(.*?)(?:(authorization=[^;]+;)(.*))?$
查看这个正则表达式演示。由于整个不匹配字符串将落在组1中,用$2
替换仍然会产生空输出。
细节:
(.*?)
-组1:除换行符外的任何零或多个字符尽可能少(?:(authorization=[^;]+;)(.*))?
—可选的非捕获组(authorization=[^;]+;)
-组2:authorization=
,一个或多个非分号和;
字符(.*)
-组3:除换行符以外的任何零个或多个字符尽可能多
如果不需要访问Group 3的值,则去掉最后一个.*
的括号。