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

你可以做的是使用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根本不会设置相应的标头。

最新更新