location /api {
# save original "Cookie" header value
set $altered_cookie $http_cookie;
# check if the "my_cookie" cookie is present
if ($http_cookie ~ '(.*)(^|;\s)my_cookie=("[^"]*"|[^\s]*[^;]?)(\2|$|;$)(?:;\s)?(.*)') {
# cut "my_cookie" cookie from the string
set $altered_cookie $1$4$5;
}
# hide original "Cookie" header
proxy_hide_header Cookie;
# set "Cookie" header to the new value
proxy_set_header Cookie $altered_cookie;
... # other proxy settings here
proxy_pass <upstream>; # change to your upstream server
}
2条答案
按热度按时间frebpwbc1#
假设您使用的是
proxy_pass
指令,并且您的cookie名称为my_cookie
,您可以通过以下方式从Cookie
HTTP头中剪切此cookie及其值:这个复杂的正则表达式允许检查
my_cookie
cookie是否存在,无论它是在Cookie
头值的开头,中间还是结尾。下面是几个例子,展示了这个正则表达式如何在不同的字符串上工作:对于那些正在寻找相同的配方,但使用
fastcgi_pass
而不是proxy_pass
的人-使用fastcgi_param HTTP_COOKIE $altered_cookie if_not_empty;
而不是proxy_hide_header
和proxy_set_header
指令。ecbunoof2#
我建议使用
map
语法而不是if
(if
是邪恶的)。另外,在我看来,你也可以忽略非捕获组(?:;\s)?
。因此,我按如下方式实现了这一点: