将跨域响应头抽成独立 cors.conf 文件并用 include 引入,可提升 nginx 配置可维护性与复用性;文件仅含 add_header 指令且带 always 参数,置于 /etc/nginx/conf.d/ 下,在 location 或 server 块中引入即可生效。

把跨域响应头抽成独立文件用 include 引入,是 Nginx 配置中提升可维护性、避免重复的关键做法。它能让同一套 CORS 头在多个站点或 location 中复用,修改一处,全局生效。
跨域头配置文件单独存放
在 /etc/nginx/conf.d/(或宝塔的 /www/server/panel/vhost/nginx/ 下统一目录)新建一个 cors.conf 文件,内容只写响应头,不包含任何 location 或 server 结构:
add_header 'Access-Control-Allow-Origin' '$http_origin' always; 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; add_header 'Access-Control-Allow-Credentials' 'true' always;
注意:
- 使用
$http_origin动态取请求头中的 Origin,比硬写*更安全,尤其配合Access-Control-Allow-Credentials true时必须这么做; - 所有
add_header后加always,确保即使返回 302、404 等非 2xx 状态码时头也生效; - 不要在该文件里写
if、proxy_pass或return,保持纯粹的头注入逻辑。
在站点配置中引入
打开宝塔面板中目标站点的 Nginx 配置文件(【网站】→【设置】→【配置文件】),在需要支持跨域的 location 块内(如 /api/)或 server 块顶层插入:
location /api/ {
include /etc/nginx/conf.d/cors.conf;
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
也可以放在 server 块开头,让整个站点都带 CORS 头(慎用,静态资源通常不需要):
server {
listen 80;
server_name example.com;
include /etc/nginx/conf.d/cors.conf; # 全局生效
location / {
root /www/wwwroot/example.com;
index index.html;
}
}
多环境适配建议(进阶)
若需开发、测试、生产环境使用不同策略,可配合 map 指令 + 多个 include:
- 新建
cors-dev.conf、cors-prod.conf; - 在主配置中用
map判断环境变量或 Host,设$cors_conf变量; - 再
include $cors_conf—— Nginx 支持变量形式的 include(需 1.10+)。
验证与注意事项
- 修改后务必点击【重载配置】,不要只点保存;
- 浏览器开发者工具 → Network → 查看响应头是否出现
Access-Control-Allow-*; - 若看到头没生效,检查:
-
include路径是否拼写正确、文件是否存在且有读取权限; - 是否被
proxy_hide_header或后端响应覆盖(可在proxy_pass后加proxy_hide_header显式清除后端同名头); -
add_header作用域是否匹配(在location里写的头,不会自动继承到子location)。
-
不复杂但容易忽略











