NGINX反向代理后出现MIME类型校验错误及CORS问题求助
我来帮你排查这个问题,这种严格MIME类型检查失败的情况在NGINX反向代理场景里挺常见的,咱们一步步分析解决:
问题根源
这个错误(Refused to execute script because strict MIME type checking is enabled)本质是浏览器收到的响应Content-Type头不符合脚本文件的预期(比如本该是application/javascript,结果返回了text/plain或者其他错误类型),导致浏览器拒绝执行脚本。大概率是NGINX没有正确识别或传递源站的MIME类型,或者配置中篡改了响应头。
具体排查与解决步骤
1. 确保NGINX加载了默认MIME类型配置
NGINX依赖mime.types文件来识别不同文件对应的MIME类型,首先检查你的NGINX主配置(比如nginx.conf)里是否包含了这个文件:
http { include /etc/nginx/mime.types; # 路径可能根据你的系统有所不同 default_type application/octet-stream; # 其他http级配置... }
如果没加载这个文件,NGINX无法正确识别脚本文件类型,会默认返回application/octet-stream,触发浏览器的MIME检查错误。
2. 调整反向代理配置,确保正确传递/设置MIME类型
针对你伪装请求来源解决CORS的场景,在反向代理的location块里,需要同时处理请求头伪装和响应头的MIME类型传递:
server { server_name www.bbb.com; # 针对那个有问题的脚本路径单独配置 location /scripts/some.script { proxy_pass https://www.aaa.com/scripts/some.script; # 伪装请求来源,解决CORS proxy_set_header Host www.aaa.com; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 确保源站的Content-Type头被正确传递,不被NGINX篡改 proxy_pass_header Content-Type; # 如果源站本身返回的Content-Type不对,可强制设置正确类型 # add_header Content-Type application/javascript; } # 其他location配置(比如你的额外页面)... }
proxy_pass_header Content-Type:强制NGINX把源站返回的Content-Type头原封不动传递给客户端,避免被默认规则修改。- 如果测试发现源站本身返回的MIME类型就不对,就把注释掉的
add_header行打开,强制设置application/javascript(根据脚本实际类型调整,比如是CSS就用text/css)。
3. 检查gzip压缩是否干扰MIME类型
有时候NGINX的gzip压缩配置可能会意外修改响应头,你可以先临时关闭gzip测试:
gzip off;
如果关闭后错误消失,说明是gzip配置的问题,调整gzip只针对正确的类型压缩:
gzip on; gzip_types text/javascript application/javascript text/css application/json;
4. 用curl验证响应头
执行以下命令,对比反向代理和源站的响应头,确认Content-Type是否一致:
# 访问反向代理地址 curl -I https://www.bbb.com/scripts/some.script # 直接访问源站地址 curl -I https://www.aaa.com/scripts/some.script
如果反向代理返回的Content-Type和源站不一致,就说明NGINX的配置有问题,需要调整上面的步骤。
总结
多数情况下,加载默认的mime.types文件+确保反向代理正确传递Content-Type头就能解决这个问题。如果还是不行,检查是否有其他NGINX模块(比如安全模块)修改了响应头,或者源站本身的配置存在问题。
内容的提问来源于stack exchange,提问作者zabumba

