首页 > 解决方案 > nginx 配置中的条件块显然不起作用

问题描述

我需要在我的 nginx 配置中将 CORS 标头添加到虚拟主机。我只想在某些条件下显示标题,但我无法适当地设置我的 if 块。我希望始终添加 if 块内的标题,但不添加任何标题,包括 if 块之外的标题。这是我的配置:

    location /images/ {
            fastcgi_pass    localhost:9000;
            fastcgi_param   PATH_INFO $fastcgi_script_name;
            fastcgi_param   REQUEST_METHOD $request_method;
            fastcgi_param   QUERY_STRING $query_string;
            fastcgi_param   CONTENT_TYPE $content_type;
            fastcgi_param   CONTENT_LENGTH $content_length;
            fastcgi_param   SERVER_PROTOCOL $server_protocol;
            fastcgi_param   REQUEST_URI $request_uri;
            fastcgi_param   HTTPS $https if_not_empty;
            set $cors "test";
            set $mytest "true";
            add_header 'Test2' "$mytest";
            if ($cors = "test") {
              add_header 'Access-Control-Allow-Origin' "$http_origin" always;
              add_header 'Access-Control-Allow-Credentials' 'true' always;
              add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;
              add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always;
            }
   }

标签: nginxnginx-locationnginx-config

解决方案


您可以做的是使用map指令替换:

map $cors $cors_origin {
    "test"  "$http_origin";
}
map $cors $cors_credentials {
    "test"  "true";
}
map $cors $cors_methods {
    "test"  "GET, POST, PUT, DELETE, OPTIONS";
}
map $cors $cors_headers {
    "test"  "Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With";
}

server {
    ...
    location /images/ {
        fastcgi_pass    localhost:9000;
        fastcgi_param   PATH_INFO $fastcgi_script_name;
        fastcgi_param   REQUEST_METHOD $request_method;
        fastcgi_param   QUERY_STRING $query_string;
        fastcgi_param   CONTENT_TYPE $content_type;
        fastcgi_param   CONTENT_LENGTH $content_length;
        fastcgi_param   SERVER_PROTOCOL $server_protocol;
        fastcgi_param   REQUEST_URI $request_uri;
        fastcgi_param   HTTPS $https if_not_empty;
        set $cors "test";
        add_header 'Access-Control-Allow-Origin' $cors_origin always;
        add_header 'Access-Control-Allow-Credentials' $cors_credentials always;
        add_header 'Access-Control-Allow-Methods' $cors_methods always;
        add_header 'Access-Control-Allow-Headers' $cors_headers always;
    }
}

如果$cors变量的值不是"test",则map替换结果将是一个空字符串,并且 nginx 根本不会设置相应的标头。


推荐阅读