跨域API请求Nginx配置修复外贸站点
前言:你的外贸站点API请求被浏览器阻止了吗?
运营外贸站点时,前端H5页面常常需要调用不同域名下的后端API(比如 api.yoursite.com 调用 order.foreign.com)。
如果浏览器控制台出现“Access-Control-Allow-Origin”相关的报错,说明跨域请求被拦截了。
本文会从零开始,教你用Nginx配置CORS(跨域资源共享)头,让外贸站点的API通信恢复正常。
即使你不会写代码,跟着下面的步骤也能自己搞定。
准备条件:确认你的环境
在操作前,请确保满足以下几点:
- 你拥有外贸站点服务器的 SSH登录权限 或 宝塔面板等可视化管理工具。
- Nginx已经安装并正常运行(通过
nginx -v可查看版本)。 - 你清楚需要跨域的 来源域名(即前端页面所在的域名)和 目标API域名(接口所在域名)。
- 准备好一个文本编辑器(如vim、nano),或直接在宝塔的文件管理里编辑nginx配置。
如果你的服务器还没装Nginx,
先执行 sudo apt install nginx(Debian/Ubuntu)或 sudo yum install nginx(CentOS/RHEL),
并启动:sudo systemctl start nginx。
核心步骤:在Nginx配置文件中添加CORS头
1. 找到需要配置的站点配置文件
Nginx的站点配置文件通常位于 /etc/nginx/sites-available/(或 /etc/nginx/conf.d/)下,文件名一般是你的站点域名。
用SSH连接服务器后,输入:
sudo nano /etc/nginx/sites-available/yourdomain.com
如果用宝塔面板,直接在“网站”列表中找到站点,点击“设置” -> “配置文件”。
2. 定位到你需要跨域的 location 块
CORS配置一般要放在处理API请求的 location 里。
例如,你的API都托管在 api.yourdomain.com 的 location /api/ 下,就找到类似这样的代码段:
location /api/ {
proxy_pass http://127.0.0.1:8080; # 后端服务地址
# 其他配置
}
3. 插入CORS配置指令
在 location 块内添加以下几行(如果已存在类似配置则替换或合并):
location /api/ {
proxy_pass http://127.0.0.1:8080;
# 允许的源域名,可写具体域名或 * (生产不建议用*)
add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
# 当请求带自定义头时,浏览器会发OPTIONS预检请求,下面处理它
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization";
# 允许携带Cookie凭证(如果前端用withCredentials)
add_header Access-Control-Allow-Credentials "true";
# 处理预检请求(OPTIONS)
if ($request_method = OPTIONS) {
add_header Access-Control-Allow-Origin "https://your-frontend-domain.com";
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
add_header Access-Control-Allow-Headers "$http_access_control_request_headers";
add_header Access-Control-Max-Age 1728000;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}
}
注意事项:
Access-Control-Allow-Origin一定要写成你前端页面的 精确域名(包括协议),如https://www.myshop.com。如果前端有多个域名,可以用$http_origin动态判断,但为安全起见,不要直接写*并同时设置Access-Control-Allow-Credentials: true。Access-Control-Allow-Methods根据你的API实际使用的方法调整(如 PUT、DELETE)。Access-Control-Allow-Headers需要包含前端请求中携带的所有自定义头。常见的有Content-Type和Authorization。
4. 测试配置文件并重载Nginx
# 检查语法
sudo nginx -t
# 如果返回 syntax is ok,则重载
sudo systemctl reload nginx
如果在宝塔面板,点击“保存”后,会自动重载Nginx。
避坑指南:90%新手会踩的坑
坑1:预检请求(OPTIONS)返回 405 或 403
很多后端没有单独处理 OPTIONS 请求,导致跨域失败。
上面的配置用 if ($request_method = OPTIONS) 强制返回204,绕过后端逻辑。
坑2:Access-Control-Allow-Origin 写成了 * 且同时设置了 Access-Control-Allow-Credentials: true
浏览器会拒绝这种组合。
要么去掉 Access-Control-Allow-Credentials,要么将 * 改为具体域名。
坑3:配置生效后浏览器仍然报跨域错误
- 清空浏览器缓存或开启无痕模式重新测试。
- 检查Nginx重载是否成功:
ps aux | grep nginx查看进程。 - 用curl模拟请求:
curl -H "Origin: https://your-frontend-domain.com" -H "Access-Control-Request-Method: GET" -X OPTIONS -v https://api.yourdomain.com/api/xxx
如果返回头里没有 Access-Control-Allow-Origin,说明配置未正确加载。
坑4:外贸站点使用了CDN或WAF
如果API域名启用了Cloudflare等CDN,Nginx配置可能被边缘节点覆盖。
你需要在CDN控制台也添加CORS相关头,或者CDN透传origin头。
效果验证:用浏览器确认问题已修复
- 打开外贸站点的前端页面。
- 按F12打开开发者工具,切换到 Network 标签。
- 刷新页面,找到调用API的请求(一般是XHR类型)。
- 点击该请求,在 Response Headers 中查看是否存在
Access-Control-Allow-Origin: https://你的前端域名。 - 同时确认控制台的Console区域不再有红色CORS报错。
如果你的前端使用了 fetch 或 axios 并且设置了 credentials:,
'include'
还需要确认 Access-Control-Allow-Credentials: 已返回,
true
并且 Access-Control-Allow-Origin 不是通配符。
扩展补充:
如果仍然失败,
可以临时在Nginx配置中开启调试日志( error_log /var/log/nginx/error.log debug; ),
重启后查看日志定位具体拒绝原因。
总结
跨域问题是外贸站点前后端分离架构下的常见痛点,通过Nginx简单配置CORS头即可解决。
关键点在于:
- 明确你的前端域名,不要使用
*与credentials混用。 - 务必单独处理OPTIONS预检请求。
- 修改配置后记得
nginx -t并重载。
如果你在配置过程中遇到其他报错(比如 502、504),通常是后端服务未启动或代理地址错误,请先检查 proxy_pass 指向的目标是否可用。
希望本文能帮你快速修复外贸站点的跨域API请求问题。