如何在zalando的skipper-filter中使用regex将可选cookie列入白名单 &g



我想使用正则表达式修改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的值,则去掉最后一个.*的括号。

最新更新