问题
在nginx配置了add_header 'Access-Control-Allow-Origin' '*';但是为什么还是跨域呢
如图:在相应头中没有返回'Access-Control-Allow-Origin' '*';
nginx配置如下:
location /libs/bigdataos{
if ($request_filename ~* .*.(js|css|mp4|png|jpg|jpeg|woff|gif|ogg|ogv)$) {
add_header Cache-Control "no-cache, max-age=-1";
}
add_header 'Access-Control-Allow-Origin' '*';
alias /export/diweb/di-micro-config/lib;
}
解决方案
将配置改成如下,问题得到解决
location /libs/bigdataos{
if ($request_filename ~* .*.(js|css|mp4|png|jpg|jpeg|woff|gif|ogg|ogv)$) {
add_header Cache-Control "no-cache, max-age=-1";
add_header 'Access-Control-Allow-Origin' '*';
}
alias /export/diweb/di-micro-config/lib;
}
如图已经返回了响应头
原因分析
本来add_header 'Access-Control-Allow-Origin' '';写到nginx的location块中是可以对此路径下的所有文件生效,但是由于我们对静态文件(js,css等)进行了缓存设置,所以导致if中的配置优先级更高。nginx配置的解析逻辑是,如果有if进行明确的类型匹配,那么在if之外的配置不会对if所匹配的文件生效,所以需要将add_header 'Access-Control-Allow-Origin' '';放入if语句之中,即可生效。