多个if如果在同一个位置块中进行交互?

时间:2018-02-27 18:01:30

标签: nginx server-configuration

我们很难理解多个if语句在nginx中是如何工作的:

  1. 我们有一个if语句,当请求来自某个域时,它应该设置CORS头
  2. 我们有一个if语句,当请求方法是OPTION时,它应该设置一些标题。
  3. 但是,当请求都有方法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;
        }
    }
    

1 个答案:

答案 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;
}