我正在寻找一个nginxconfiguration设置,它将Access-Control-Allow-Origin
设置为Access-Control-Allow-Origin
中收到的值。
看起来, *
方法不适用于Chrome,并且多个URL不能用于Firefox,因为CORS规范不允许。
到目前为止,唯一的解决scheme是将Access-Control-Allow-Origin
设置为Access-Control-Allow-Origin
中接收的值(是的,可以执行一些validation)。
问题是如何在nginx中做到这一点,最好不要安装额外的扩展。
set $allow_origin "https://example.com" # instead I want to get the value from Origin request header add_header 'Access-Control-Allow-Origin' $allow_origin;
使用if
有时可能会中断其他配置,例如try_files
。 你可能会以意想不到的404s结束。
改用地图
map $http_origin $cors_header { default ""; "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin"; } server { ... location / { add_header Access-Control-Allow-Origin $cors_header; try_files $uri $uri/ /index.php; } ... }
如果是邪恶的
我开始自己使用这个,这是我当前的Nginx配置中的一行:
add_header 'Access-Control-Allow-Origin' "$http_origin";
这设置一个标头,允许请求的来源作为唯一的允许的来源。 所以你从哪里来,是唯一允许的地方。 所以与允许“*”应该没有什么不同,但是从浏览器的角度来看它更具体。
另外,您可以在Nginx配置中使用条件逻辑来指定要允许的主机名白名单。 以下是https://gist.github.com/Ry4an/6195025中的一个示例
if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) { add_header Access-Control-Allow-Origin "$http_origin"; }
我打算在我自己的服务器上尝试这种技术,将允许的域列入白名单。