为什么Nginx proxy\u pass在与变量一起使用时忽略add\u头?
我正在尝试使用Nginx创建一个动态CORS代理,这样我就可以使用前端代码中的多个API,而不会出现任何CORS错误。我目前的方法是使用多个为什么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
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,尽管我可能只是犯了一个明显的错误。我找不到任何地方提到这个问题,尽管它是一个非常具体的用例