我们很难理解多个if语句在nginx中是如何工作的:
但是,当请求都有方法OPTIONS并来自某个域时,不会设置CORS头。多个if语句如何在Nginx中的单个位置上下文中工作?
server {
listen 127.0.0.1:80;
server_name myserver.com;
set $cors '';
if ($http_origin ~ '^https?://*.\.com') {
set $cors 'true';
}
location / {
proxy_pass http://myserver:9000;
if ($cors = 'true' ){
add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
}
if ($request_method = 'OPTIONS') {
# Tell client that this pre-flight info is valid for 20 days
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
### force timeouts if one of backend is died ##
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
### Set headers ####
proxy_set_header Accept-Encoding "";
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
add_header Front-End-Https on;
proxy_redirect off;
}
}
答案 0 :(得分:0)
add_header
指令与其他Nginx指令的行为略有不同,因为如果它包含在当前块中,它不会从另一个配置块继承。
有几种方法取决于您在决定添加哪些标头时需要多少粒度,您可以使用map
指令,但看起来您只有3组标题,一组用于所有连接然后你的两个条件集然后为了简单起见你可以将你的ifs移动到服务器块。
你要添加很多标题,所以为了清楚起见,我会将每个集保存在它自己的.conf文件中。然后在你的服务器块中你已经有一个if指令,所以改变它并添加你的其他if语句,并包括你想为服务器块中的每个人设置的代理头:
include headers/proxy-headers.conf;
if ($http_origin ~ '^https?://*.\.com') {
include headers/cors-headers.conf;
}
if ($request_method = 'OPTIONS') {
include headers/options-headers.conf;
}