nginx怪事连连?为什么配置的add_header不生效呢

1,818 阅读1分钟

问题

在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语句之中,即可生效。