同一位置块中的多个 if 如何交互?

Posted

技术标签:

【中文标题】同一位置块中的多个 if 如何交互?【英文标题】:How do multiple if in the same location block interact? 【发布时间】:2018-08-07 11:33:06 【问题描述】:

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

    我们有一个 if 语句,当请求来自某个域时,它应该设置 CORS 标头 我们有一个 if 语句,当请求方法为 OPTION 时,它应该设置一些标头。

但是,当请求同时具有方法 OPTIONS 并且来自某个域时,不会设置 CORS 标头。在 Nginx 中,多个 if 语句如何在单个位置上下文中工作?

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;
    

【问题讨论】:

它们是如何工作的?他们没有。见这里nginx.com/resources/wiki/start/topics/depth/ifisevil 我读到了,那么完成我需要的正确模式是什么?重复? 【参考方案1】:

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;

【讨论】:

以上是关于同一位置块中的多个 if 如何交互?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript -JQuery 中否定“if”语句块中的代码,例如“if not then ..”

如何与同一物理智能卡上的多个 javacard 应用程序交互(如 yubikey)

求助大牛!C++编程,如何查询数据库中多条记录的多个字段值,并且返回到一个数据块中...急急急!

如何在一个滑块上添加多个滑块? #扑

如何使用多个catch块处理异常

TCPDF:如何将图像放入 HTML 块中?