我正在寻找一个nginx配置设置,它会将Access-Control-Allow-Origin
设置为Origin
中收到的值。
似乎*
方法无法与Chrome配合使用,多个网址无法与Firefox配合使用,因为CORS规范不允许这样做。
到目前为止,唯一的解决方案是将Access-Control-Allow-Origin
设置为原始接收的值(是的,可以实现一些验证)。
问题是如何在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;
答案 0 :(得分:35)
使用if
有时会破坏其他配置,例如try_files
。你最终会得到意想不到的404。
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;
}
...
}
答案 1 :(得分:19)
我自己开始使用它,这是我当前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";
}
我计划在自己的服务器中尝试使用此技术将允许的域列入白名单。