cors.conf 内容
#CORS
# #Allow all requset/method/header/custom credentials
add_header 'Access-Control-Allow-Origin' $http_origin always;
#add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Max-Age' 86400 always;
# 缓存 + 预检复用,动态允许所有方法可能会翻车,并且某些请求根本没有 Access-Control-Request-Method(非预检的简单请求、curl / 非浏览器客户端、代理 / 中转,此时会变为空值),上述场景中,动态允许所有方法最后的实际含义却变成了我允许你这一次用什么方法,所以最好明确定义所有支持的方法,对于任意的每次请求就不会踩坑掉坑里
#add_header 'Access-Control-Allow-Methods' $http_access_control_request_method always;
# 把 http RFC 现行标准里的核心方法 + WebDAV 的 RFC 标准定义的方法全部允许
add_header 'Access-Control-Allow-Methods' 'GET,HEAD,POST,PUT,DELETE,TRACE,OPTIONS,PATCH,CONNECT,COPY,LOCK,MKCOL,MOVE,PROPPATCH,PROPFIND,UNLOCK,REPORT,CHECKOUT,MERGE,MKACTIVITY,SEARCH,ACL,LINK,UNLINK,PRI' always;
add_header Vary "Origin" always;
if ($request_method = 'OPTIONS') {
return 204 always;
}
把配置保存为 cors.conf 到 nginx 配置目录,通过 include 指令进行复用 ,在需要的 location 段引入该配置,如
location ~* ^/api/ {
include /usr/local/nginx/conf/cors.conf;
}
效果
- 允许所有来源
- 允许所有请求头
- 允许所有 HTTP 方法(动态允许所有 Header 有些场景会翻车,比如第一次预检 PUT,第二次实际请求 POST,发现 Allow-Methods 里没有 POST,会拒绝,特别是 fetch 复用连接,service worker,跨页面请求等)
- 允许携带凭证
- 正确处理预检请求
- 适配 CDN 缓存场景,让 CDN / 代理正确区分不同 Origin