Nginx处理跨域的核心是location精准路由+proxy_pass转发+显式设置CORS响应头,而非location本身解决跨域;需正确配置路径拼接、预检请求放行及代理请求头以确保后端正确响应并被浏览器接受。

处理跨域请求的路径转发,核心不是 location 本身解决跨域,而是用 location 做精准路由,再配合 proxy_pass 转发 + CORS 头设置,让后端响应被浏览器接受。location 只负责“把 /api/ 开头的请求挑出来”,真正绕过浏览器同源策略的是后续的代理行为和响应头。
location 要精准匹配 API 路径前缀
跨域通常发生在前端调用后端接口时(如 /api/login),所以 location 必须明确圈定这些路径,避免误伤静态资源或根页面:
- 用 前缀匹配:例如
location /api/ { ... },能覆盖 /api/user、/api/v2/orders 等所有子路径 - 避免模糊匹配:不要写
location /api { ... }(没结尾斜杠),它会意外匹配 /apixxx 或 /api-docs,导致转发错乱 - 优先级要稳:如果同时有
location /api/和location ~* \.(js|css)$,前者必须放在静态资源规则之前,否则正则可能抢先截走请求
proxy_pass 配置决定路径是否被重写
转发路径拼接方式直接影响后端能否正确解析 URL:
-
带尾部斜杠:如
proxy_pass http://backend:8080/;,访问/api/users会转发为http://backend:8080/users(/api/ 被剥离) -
不带尾部斜杠:如
proxy_pass http://backend:8080;,访问/api/users会转发为http://backend:8080/api/users(完整路径保留) - 选哪种取决于后端服务的路由设计——Spring Boot 默认识别 /api/ 开头,适合带斜杠;而某些微服务网关期望全路径,则用不带斜杠
必须添加 CORS 响应头
仅转发还不够,浏览器看到响应里没有 Access-Control-Allow-Origin 就仍会报跨域错误:
- 在 location 块内加三行关键头:
add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization"; - 对 OPTIONS 预检请求要显式放行:
if ($request_method = 'OPTIONS') { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods "GET, POST, OPTIONS"; add_header Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization"; add_header Access-Control-Max-Age 1728000; return 204; } - 生产环境慎用
*,建议替换成具体前端域名,如$http_origin(需配合Access-Control-Allow-Credentials true时使用)
别漏掉基础代理头信息
后端服务常依赖原始请求上下文,否则可能返回 404 或权限拒绝:
-
proxy_set_header Host $host;:防止后端因 Host 不匹配拒绝请求 -
proxy_set_header X-Real-IP $remote_addr;:传真实客户端 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:补全代理链路,尤其多层 Nginx 时必需 - 这些必须写在 proxy_pass 同一 location 块内,否则不生效


















