跨域API接口Nginx完整修复配置教程

零基础搞定跨域API接口Nginx配置修复教程

前后端分离开发时,浏览器经常报错“No 'Access-Control-Allow-Origin' header is present”,这就是跨域问题。
只要你的API经过Nginx反向代理,完全不用改后端代码,在Nginx里加几行配置就能修复。
本文为你拆解完整操作步骤,附带避坑和验证方法,照着做就能搞定。

准备条件:确认你的环境

  • 一台已经安装了Nginx的服务器(版本不限制,1.10以上均可)
  • 你的API接口地址(例如 http://api.example.comhttp://localhost:8080
  • 一个需要调用该API的前端站点域名(例如 https://www.myfrontend.com
  • 能通过SSH登录服务器,或者有宝塔面板等Nginx管理工具
如果还没有配置过Nginx站点,建议先完成基本的站点创建和SSL证书安装。

核心操作:在Nginx配置中添加跨域响应头

第一步:找到站点配置文件

用你习惯的方式编辑Nginx配置文件。
一般位于 /etc/nginx/conf.d//etc/nginx/sites-available/
如果使用宝塔面板,在“网站”设置中找到“配置文件”标签。

第二步:在location块中添加跨域头

假设你的API接口映射在 location /api/ 下,在对应的location块内加入以下代码:

location /api/ {
    # … 原有的代理配置,比如 proxy_pass http://127.0.0.1:8080; …

    # 允许指定域名跨域(用实际域名替换)
    add_header Access-Control-Allow-Origin 'https://www.myfrontend.com' always;

    # 允许携带凭证(cookies/HTTP认证)
    add_header Access-Control-Allow-Credentials 'true' always;

    # 允许的HTTP方法
    add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS' 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-Max-Age 1728000 always;
}

特别说明: always 参数确保即使后端返回非200状态码(如404、500),Nginx也会添加上这些跨域头。
如果不加 always,只有成功响应才会携带跨域头,可能导致前端模模糊糊报错。

第三步:单独处理OPTIONS预检请求

浏览器在发起POST、PUT、DELETE或带有自定义头的请求前,会先发一个OPTIONS请求询问服务器是否允许。
很多后端不会处理这个请求,所以我们要让Nginx直接返回204并终止请求:

location /api/ {
    # 上述跨域头配置保留

    if ($request_method = 'OPTIONS') {
        add_header Access-Control-Allow-Origin 'https://www.myfrontend.com';
        add_header Access-Control-Allow-Credentials 'true';
        add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization';
        add_header Access-Control-Max-Age 1728000;
        add_header Content-Length 0;
        add_header Content-Type text/plain;
        return 204;
    }

    # 其他代理配置…
}
注意:上面的 if 块只处理OPTIONS,不影响正常的GET/POST请求。

第四步:测试配置并重载Nginx

nginx -t
# 如果输出 syntax is ok 和 test is successful,则继续

systemctl reload nginx   # 或 service nginx reload

避坑指南:这些细节容易出错

  1. 本地开发时不要用 *credentialsAccess-Control-Allow-Origin: *Access-Control-Allow-Credentials: true 不能同时使用,否则浏览器会报错。必须指定具体域名。
  2. header命名大小写敏感? 多数浏览器不区分,但为了兼容,直接使用标准大小写(Access-Control-Allow-Origin)即可。
  3. 别忘了处理静态文件跨域:如果前端要加载API服务器上的字体、图片等静态资源,也要在对应的location里加上跨域头,否则浏览器不会呈现。
  4. location块的位置影响继承:如果你在server块上加跨域头,它会作用到所有location;如果在某个子location上加,则仅生效于该子location。避免同时设置而意外覆盖。
  5. 使用CDN或WAF时:部分CDN(如Cloudflare)会缓存响应头,需留意在CDN层面也配置跨域策略或关闭缓存。

效果验证:确认跨域已修复

方法一:浏览器开发者工具

打开前端页面(如 https://www.myfrontend.com),按F12进入Console,发起一个API请求。
如果不再显示CORS错误,且Network标签中的响应头能看到 Access-Control-Allow-Origin,表明配置成功。

方法二:直接使用curl测试

在服务器上或任意终端执行:

curl -I -H 'Origin: https://www.myfrontend.com' http://你的API域名/api/xxx

输出中应包含:

access-control-allow-origin: https://www.myfrontend.com
access-control-allow-credentials: true

也可以直接测试OPTIONS预检:

curl -X OPTIONS -H 'Origin: https://www.myfrontend.com' -H 'Access-Control-Request-Method: POST' http://你的API域名/api/xxx -I

返回204并且包含跨域头即正常。

常见问题FAQ

Q:加了配置后还是报跨域错误?
A:首先检查 nginx -t 是否报错,然后确认reload成功。其次看浏览器报错信息里的“Allow-Origin”是哪个域名,确保和你配置的一致。如果API路径不匹配location,Nginx不会应用跨域头。

Q:add_header 总是被上层块覆盖怎么办?
A:在子location里重复声明一次即可,或者使用 add_header ... always; 并避免在父块里设置同样名字的header。

Q:我想允许所有外部域名访问(不推荐生产环境)怎么办?
A:将 Access-Control-Allow-Origin 设置为 '*',但同时必须去掉 Access-Control-Allow-Credentials,并且OPTIONS处理也要相应调整。

如果按照本文步骤操作后仍有问题,建议先在服务器上用curl模拟请求,排除前端因素,再逐行检查配置是否有笔误。
学会配置Nginx跨域,以后前后端联调效率直接翻倍。

分享到:
上一篇
SSH密钥登录禁用密码防暴力破解:SSH密钥登录配置指南
下一篇
进程网络速度批量限制防止带宽占满
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意