如何正确设置Nginx的访问控制 – 允许 – 原产地基于来自请求Origin头的响应头?

我正在寻找一个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"; } 

我打算在我自己的服务器上尝试这种技术,将允许的域列入白名单。