【问题标题】:How to conditionally override a header in nginx only if a cookie exist?仅当存在 cookie 时,如何有条件地覆盖 nginx 中的标头?
【发布时间】:2016-10-28 13:35:22
【问题描述】:

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

现在我有一个类似下面的部分来设置 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,您的编辑导致问题中的相关信息被删除。在您进行编辑后,OP 想要完成的工作不再清晰。

标签: if-statement cookies nginx http-headers ngx-http-rewrite-module


【解决方案1】:

nginxif 上下文中只允许有限数量的指令。这与ifrewrite 模块的一部分有关;因此,在其上下文中,您只能使用模块文档中特别列出的指令。

绕过这个“限制”的常用方法是使用中间变量建立状态,然后使用像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": "There was no x-client-id and could not extract client_id from Authorization header."}
  • 看来x-client-id的标头未设置时,第一行引发错误并返回400给用户
  • @AlirezaHos,我不知道你为什么会得到它,它肯定不是来自 nginx。在你的报告之后,我实际上已经尝试了上面非常精确的配置,并且它按预期工作。如果你想有一个默认值,当上述任何一个选项都没有设置时,只需添加一个额外的 if 语句(只要确保它们是顺序的,而不是嵌套的)。
  • @AlirezaHos,所以,这应该真的有效!如果您仍有一些问题,如果您需要进一步的帮助,请随时添加更多信息。
  • 感谢它按预期工作。我不知道过去的问题是什么。今天我在另一台机器上进行了测试,它工作正常。
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 2017-10-10
  • 2023-01-31
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
相关资源
最近更新 更多