我的目标是将对网络应用程序的访问限制为任何没有来源的请求= http://localhost:3000
所以经过一段时间的互联网搜索后,我能够通过这种配置来(好吧,复制粘贴):
location / {
set $cors '';
if ($http_origin ~ 'http://localhost:3000') {
set $cors 'true';
}
if ($cors = 'true') {
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, PATCH, DELETE, PATCH, 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;
}
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;
}
proxy_pass http://10.131.20.142:8000/131j3yc1;
proxy_set_header received-from "nginx";
access_log /dev/stdout upstream_log;
}
我测试它以了解它的行为方式。当我发送带有http://localhost:3000
的请求时,它会发送200 OK和CORS标头。当我发送没有来源或不同来源的请求时,它仍然发送200 OK但没有CORS头。当浏览器获得带有CORS头的响应时,它工作正常但是当CORS头不存在时,它会抛出这样的异常:
我想了解这里保护的CORS配置是什么?
我猜测我的配置是错误的,因为它不能有效地保护应用程序免受交叉源请求或我对CORS的理解不正确。
有人可以帮助我弄清楚我在做什么/理解错误吗?
答案 0 :(得分:0)
尝试使用 more_set_headers 而不是 add_header :
more_set_headers 'Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, PATCH, OPTIONS';
more_set_headers 'Access-Control-Allow-Headers:Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With';
etc
more_set_headers 指令是HttpHeadersMore模块的一部分,该模块包含在nginx的nginx-extras flavor中,您可以通过执行以下操作将其安装在ubuntu 16上:
sudo apt-get install nginx-extras