为什么Nginx proxy\u pass在与变量一起使用时忽略add\u头?

为什么Nginx proxy\u pass在与变量一起使用时忽略add\u头?,nginx,nginx-reverse-proxy,nginx-location,Nginx,Nginx Reverse Proxy,Nginx Location,我正在尝试使用Nginx创建一个动态CORS代理,这样我就可以使用前端代码中的多个API,而不会出现任何CORS错误。我目前的方法是使用多个location块,每个域一个,这很有效,但我更希望有一个动态解决方案。我的想法是使用x-proxy-target指定上游主机名,并传递路径名。Nginx在Kubernetes上的Docker容器中运行,因此,10.245.0.10是解析器 这非常有效,并使用add\u header location / { default_type appli

我正在尝试使用Nginx创建一个动态CORS代理,这样我就可以使用前端代码中的多个API,而不会出现任何CORS错误。我目前的方法是使用多个
location
块,每个域一个,这很有效,但我更希望有一个动态解决方案。我的想法是使用
x-proxy-target
指定上游主机名,并传递路径名。Nginx在Kubernetes上的Docker容器中运行,因此,
10.245.0.10
是解析器

这非常有效,并使用
add\u header

location / {
      default_type application/json;
      if ($http_x_proxy_target = "") {
        return 400 '{"message": "No x-proxy-target header", "code": "PROXY_TARGET_NOT_SET"}';
      }

      resolver 10.245.0.10 [::1];
      set $cors '*';
      if ($http_origin != "") {
         set $cors $http_origin;
      }

      if ($request_method = "OPTIONS") {
        add_header Access-Control-Allow-Origin $cors always;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
        add_header Access-Control-Allow-Headers * always;
        return 204;
      }

      proxy_hide_header Access-Control-Allow-Headers;
      proxy_hide_header Access-Control-Expose-Headers;
      proxy_hide_header Access-Control-Allow-Credentials;
      proxy_hide_header Access-Control-Allow-Origin;
      
      proxy_set_header x-proxy-target '';
      proxy_set_header User-Agent $http_user_agent;
      proxy_set_header Connection $http_connection;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Origin https://$http_x_proxy_target;
      proxy_set_header Host $http_x_proxy_target;
      proxy_set_header Referer https://$http_x_proxy_target/;

      proxy_pass https://google.com/;

      add_header Access-Control-Allow-Headers * always;
      add_header Access-Control-Expose-Headers * always;
      add_header Access-Control-Allow-Credentials true always;
      add_header Access-Control-Allow-Origin $cors always;
}
但是当我更改
proxy\u pass
以使用提供的上游时:

location / {
      default_type application/json;
      if ($http_x_proxy_target = "") {
        return 400 '{"message": "No x-proxy-target header", "code": "PROXY_TARGET_NOT_SET"}';
      }

      resolver 10.245.0.10 [::1];
      set $cors '*';
      if ($http_origin != "") {
         set $cors $http_origin;
      }

      if ($request_method = "OPTIONS") {
        add_header Access-Control-Allow-Origin $cors always;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
        add_header Access-Control-Allow-Headers * always;
        return 204;
      }

      proxy_hide_header Access-Control-Allow-Headers;
      proxy_hide_header Access-Control-Expose-Headers;
      proxy_hide_header Access-Control-Allow-Credentials;
      proxy_hide_header Access-Control-Allow-Origin;
      
      proxy_set_header x-proxy-target '';
      proxy_set_header User-Agent $http_user_agent;
      proxy_set_header Connection $http_connection;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Origin https://$http_x_proxy_target;
      proxy_set_header Host $http_x_proxy_target;
      proxy_set_header Referer https://$http_x_proxy_target/;

      proxy_pass $scheme://$http_x_proxy_target$uri$is_args$args;

      add_header Access-Control-Allow-Headers * always;
      add_header Access-Control-Expose-Headers * always;
      add_header Access-Control-Allow-Credentials true always;
      add_header Access-Control-Allow-Origin $cors always;
}
我使用Postman得到了正确的响应,但是没有设置CORS头。我尝试将
add_header
行移动到
代理_pass
上方,但没有成功。对我来说,这似乎是Nginx中的一个可能的bug,尽管我可能只是犯了一个明显的错误。我找不到任何地方提到这个问题,尽管它是一个非常具体的用例