使用 proxy_pass 时,NGINX 不会转发标头值

使用 proxy_pass 时,NGINX 不会转发标头值

我有以下设置并配置为将所有 /api 请求发送到不同的服务器:

location /api {
    proxy_pass              https://myapp.herokuapp.com;
    rewrite                 ^/api/(.*)              /$1     break;
}

我的应用程序发送一个标头(USER_CUSTOMER),当从应用程序直接与 myapp.herokuapp.com 通信时,它可以工作,但是当通过代理服务器请求时,该值在 API 服务器上显示为 NULL。

以下内容在 NGINX 中有效,但我需要应用程序能够设置 USER_CUSTOMER 的值。

location /api {
    proxy_pass              https://app.herokuapp.com;
    proxy_set_header        USER_CUSTOMER           ABC;
    rewrite                 ^/api/(.*)              /$1     break;
}

我将来可能会发送其他标头,因此我希望有一个标志可以将所有标头从代理传递到 API 服务器。

Ubuntu
nginx/1.1.19

答案1

标头属性 USER_CUSTOMER 语法无效。下划线在标头属性中无效。

有一个解决方法,但最好的解决方案是将属性重写为有效的语法。

解决方法是在配置中指定服务器名称的地方进行以下设置:

underscores_in_headers on;

答案2

我认为您正在寻找proxy_pass_request_headers选项。将其设置为开启:

location /api {
    proxy_pass_request_headers      on;
    proxy_pass                      https://app.herokuapp.com;
    proxy_set_header                USER_CUSTOMER              ABC;
    rewrite                         ^/api/(.*)                 /$1     break;
}

答案3

我今天(2022 年 7 月)遇到了这个问题,并通过/在位置路线中添加最后一个选项进行了修复。

我的意思是,这对我来说不太好用

location /api {
    proxy_pass              https://myapp.herokuapp.com;
    rewrite                 ^/api/(.*)              /$1     break;
}

但是当我将其定义为:

location /api/ {
    proxy_pass              https://myapp.herokuapp.com;
    rewrite                 ^/api/(.*)              /$1     break;
}

成功了。不确定最后的斜线起什么作用,但也许这对某些人有帮助。

相关内容