使用 include 抽离 cors 配置为独立文件(如 /etc/nginx/snippets/cors.conf)是最干净、易复用的方式;需包含跨域头、预检处理及白名单动态匹配逻辑,并注意语法检查与作用域冲突。

直接用 include 把 CORS 配置抽成独立文件,是最干净、最易复用的做法。它不改变逻辑,只提升组织性,特别适合多站点共用同一套跨域规则的场景。
准备一个独立的 cors.conf 文件
在 Nginx 配置目录下(比如 /etc/nginx/snippets/)新建文件 cors.conf,内容如下:
-
add_header 'Access-Control-Allow-Origin' '*' always;(加always确保对所有响应生效,包括 301/404/500) add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always;add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;- 处理预检请求:
if ($request_method = 'OPTIONS') {add_header 'Access-Control-Max-Age' 1728000;add_header 'Content-Type' 'text/plain; charset=utf-8';add_header 'Content-Length' 0;return 204;}
在站点配置中引用该文件
打开宝塔面板或手动编辑站点的 Nginx 配置文件(通常在 sites-enabled/ 或网站【配置文件】页),在 server 块内、location / 或具体 API 路径块中插入:
include snippets/cors.conf;
注意路径需与实际存放位置一致。若用绝对路径,写成 include /etc/nginx/snippets/cors.conf; 更稳妥。
按需支持带凭据的跨域
如果前端需要发送 Cookie 或 Authorization 头,不能用 * 作为 Access-Control-Allow-Origin。此时可改用 map 动态匹配白名单,并把白名单逻辑也放进 cors.conf:
- 在
http块顶部(主配置文件)定义映射:
map $http_origin $cors_origin {<br>
default "";<br>
"https://a.example.com" "$http_origin";<br>
"https://b.example.com" "$http_origin";<br>
}
- 然后在
cors.conf中把第一行改为:add_header 'Access-Control-Allow-Origin' $cors_origin always;
并补上:add_header 'Access-Control-Allow-Credentials' 'true' always;
验证与注意事项
重载 Nginx 前务必检查语法:nginx -t。常见问题有:
-
add_header在if块中重复定义会报错——确保所有add_header指令都在同一作用域层级,或统一移到location块开头 - 多个
include文件里都写了同名log_format或upstream会导致启动失败 - 通配符
include sites-enabled/*会按字母序加载,确保cors.conf不被覆盖或冲突











