如何在nginx中有条件地覆盖标头,仅当存在cookie时?

4

有没有办法检查nginx中是否存在特定的cookie?

目前我有一个设置头部的部分,如下所示:

proxy_set_header x-client-id $cookie_header_x_client_id;

我希望您能够检查该cookie是否存在,如果存在则设置标头,否则不要覆盖标头。
我尝试过以下方法:
if ($cookie_header_x_client_id) {
    proxy_set_header x-client-id $cookie_header_x_client_id;
}

但是它不起作用并显示以下错误:
"proxy_set_header" directive is not allowed here in /etc/nginx/sites-enabled/website:45

有什么解决方案吗?

@Dayo,你的编辑导致问题中的重要信息被删除。在你的编辑之后,原始问题的意图变得不再清晰。 - cnst
1个回答

6

nginxif上下文中,只允许有限数量的指令。这是因为if属于rewrite模块的一部分;因此,在其上下文中,您只能使用特定于该模块文档中明确列出的指令。

解决这种“限制”的常见方法是使用中间变量来建立状态,然后使用像proxy_set_header这样的指令,使用这些中间变量:

set $xci $http_x_client_id;
if ($cookie_header_x_client_id) {
    set $xci $cookie_header_x_client_id;
}
proxy_set_header x-client-id $xci;

我得到了 {"reason": "没有x-client-id,无法从授权头中提取client_id。"} - Alireza
x-client-id的头未设置时,似乎第一行会引发错误并向用户返回400。 - Alireza
@AlirezaHos,我不知道你为什么会得到这个,它肯定不是来自nginx。在你报告之后,我实际上尝试了上面非常精确的配置,它按预期工作。如果你想要一个默认值,当上述选项都没有设置时,只需添加一个额外的if语句(只要确保它们是顺序的,而不是嵌套的)。 - cnst
@AlirezaHos,这个应该真的可以工作了!如果你仍然有一些问题,请随时添加更多信息,如果你想要进一步的帮助。 - cnst
@AlirezaHos,非常好,感谢您的慷慨奖励和接受!由于一切都完美无缺,我能否得到一个+1呢? :-) (标签评级 显然不考虑接受或奖励。)顺便说一下,两天前我已经给了您一个+1了。 - cnst
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接