nginx - 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 根本不会设置相应的标头。
推荐阅读
- label - y轴莫里斯图上的名字
- javascript - 在 json 对象中添加额外的文本
- xmlhttprequest - 使用 XMLHttpRequest 时没有“Access-Control-Allow-Origin”
- react-native - 奇怪的列表视图的分隔符
- java - 在 OpenUnderWriter 中转储来自 Hibernate 的 SQL 查询
- java - ClassFormatException io.qameta.allure.aspects.StepsAspects:常量池中的无效字节标记:18
- r - 将因子转换为二进制不对称变量类型
- api - jFrog Artifactory 仅标记文件夹内的文件
- javascript - 通过单击按钮关闭检查我何时关闭 kendoWindow
- r - 如何将列表值列拆分为多列?