Nginx一站式的跨域资源管理网关通过location路由+proxy_pass+CORS头控制,统一入口收敛多源服务,标准化响应头、限流、鉴权、HTTPS终止及可观测性封装。

用 Nginx 实现一站式的跨域资源管理网关,核心不是写一堆 if 判断,而是把 Nginx 当作统一入口,通过 location 路由 + proxy_pass + CORS 头控制,把不同源的后端服务、静态资源、第三方 API 全部收敛到一个域名下,自然消除浏览器跨域限制。
统一入口与路径路由分发
所有请求走同一个域名(如 gateway.example.com),用 location 按路径前缀区分后端目标:
- /api/v1/users → 代理到 http://user-svc:8001
- /api/v2/orders → 代理到 http://order-svc:8002
- /static/ → 代理到本地 /var/www/assets 或 CDN 回源
- /third-party/payment → 代理到 https://pay.api.vendor.com(需额外处理 Host 和 SSL)
关键点:避免用 rewrite 改写 URI 导致路径错乱;优先使用 proxy_pass 后带斜杠(如 proxy_pass http://backend/;)来自动剥离匹配的 location 前缀。
标准化跨域响应头(CORS)
不在每个 location 里重复写 add_header,而是定义 upstream 级或 server 级的默认响应头:
- 允许任意前端域名(开发期):
add_header 'Access-Control-Allow-Origin' '$http_origin' always; - 生产环境建议白名单:
map $http_origin $cors_origin { default ""; "https://app.example.com" "https://app.example.com"; },再用add_header Access-Control-Allow-Origin $cors_origin always; - 必须携带凭证时,禁用通配符:
add_header Access-Control-Allow-Credentials "true" always; - 预检请求直接返回 204:
if ($request_method = 'OPTIONS') { 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 86400; add_header Access-Control-Allow-Credentials "true"; return 204; }
细粒度权限与流量管控
网关不止转发,还要承担基础治理职责:
- 按 path 限流:
limit_req zone=api burst=10 nodelay;(配合 http 块定义 limit_req_zone) - 按来源 IP 或 token 白名单控制访问:
geo $allowed { default 0; 192.168.1.0/24 1; }+if ($allowed = 0) { return 403; } - 为第三方接口添加请求头(如 X-Forwarded-For、X-Api-Key):
proxy_set_header X-Forwarded-For $remote_addr;,proxy_set_header X-Api-Key "xxx"; - 隐藏后端真实信息:
proxy_hide_header X-Powered-By;,proxy_set_header Host $host;
HTTPS 终止与证书统一管理
所有外部流量走 HTTPS,Nginx 终止 SSL,内部通信走 HTTP 更轻量:
- 在 server { listen 443 ssl; } 块中配置证书:
ssl_certificate /etc/nginx/ssl/gateway.crt;,ssl_certificate_key /etc/nginx/ssl/gateway.key; - HTTP 自动跳转 HTTPS:
server { listen 80; return 301 https://$host$request_uri; } - 若后端需识别原始协议,透传
proxy_set_header X-Forwarded-Proto $scheme;
不复杂但容易忽略。真正让网关“一站式”的,是把路由、安全、可观测性(如 access_log 标准化格式)、错误页面统一封装,而不是只解决跨域问题。










