如何正确规划jQuery API的域名结构解决跨域访问问题?
跨域场景下独立API服务的架构设计方案
核心结论先行:你完全不需要强制通过www.domain.com/api/路径转发实现服务分离,路径转发只是众多可选方案中的一种,完全可以做到前端站点和API服务物理+逻辑上的彻底解耦。
优先选择:CORS跨域资源共享配置(业界主流标准方案)
这是目前生产环境最常用的方案,不需要调整域名路由规则,api.domain.com可以完全独立部署、独立扩缩容、独立迭代,和前端www服务没有任何基础设施层面的绑定。
你只需要在API服务的接入层(Nginx、API网关都可以)配置对应的跨域响应头,允许信任的前端域名调用即可,示例配置如下:
# 注意:不要把允许源设置为*,避免任意站点盗用你的API接口 add_header Access-Control-Allow-Origin "https://www.domain.com"; add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"; add_header Access-Control-Allow-Headers "Content-Type, X-Requested-With, Authorization"; add_header Access-Control-Allow-Credentials "true"; # 提前处理浏览器自动发起的OPTIONS预检请求,避免被业务逻辑拦截 if ($request_method = OPTIONS) { return 204; }
配置完成后,jQuery的默认ajax请求就可以正常向api.domain.com提交数据,不需要额外修改前端业务代码,只要你没有把允许源设置为通配符,就不会引入额外的安全风险。
兼容场景选择:同域名路径反向代理
如果你的业务有特殊限制(比如需要兼容极老旧的浏览器版本、内部安全规则不允许跨子域请求),可以选择你提到的路径转发方案,但要注意:这种方式依然可以实现服务完全分离。
你只需要在统一接入层(负载均衡、API网关)做流量路由规则:
- 路径匹配
/api/*的请求,全部转发到独立的API服务集群 - 其余路径的请求,全部转发到前端www静态服务集群
两个集群从部署、代码、运维层面完全独立,只是对外暴露的访问入口是同一个域名,架构上依然是完全解耦的。这种方案的额外好处是对前端完全透明,不需要处理跨域带来的预检请求开销、cookie跨域携带问题。
不推荐的历史兼容方案
以下是早期跨域方案,现在新项目基本不会使用,仅做了解:
- JSONP:仅支持GET请求,存在明显安全隐患,已经被CORS完全替代
- 主域降域:把两个子域的
document.domain都设置为主域,安全性差,适配成本高 - postMessage通信:仅适合iframe嵌入场景,普通接口调用使用成本太高
疑问解答:是否必须通过负载均衡转发www域名下的/api路径?
完全不需要。绝大多数现代前后端分离架构的站点,都是通过独立API域名+CORS配置实现服务解耦的,路径转发只是特殊兼容场景下的可选手段,不是强制要求。不管选择哪种接入方式,都可以实现前端站点和API服务的完全分离。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

