在前端开发中,经常会遇到 跨域 问题,这会导致网络请求失败,特别是在前后端分离的项目中。本文中,我们将探讨 跨域 是什么以及如何解决 跨域 问题。跨域 全称为 跨域资源共享(CORS),它是浏览器的一种安全机制,仅允许网页请求同一域名下的服务。
所谓同一域名,要求协议、域名和端口全部一致。任何一项不一致,就会构成 跨域 请求。
1. 跨域问题的原因
在前后端分离的项目中,解决 跨域 的方法主要有三种:配置后端、配置前端和配置生产环境服务器。传统的代理方式,如 JSONP,由于不适用于 React 或 Vue 这类现代开发环境,并且存在安全隐患,因此我们在此不作详细介绍。
2. 配置后端解决 跨域
首先,浏览器是否启用 跨域 保护机制是根据后端的响应决定的。配置后端是最直接有效的方法,因为浏览器依据的是响应头中的 Access-Control-Allow-Origin。如果该字段的值为星号(*),则表示允许所有来源的请求;如果是一个具体的域名,则浏览器将不对该域名下的请求进行 跨域 保护。
3. 使用中间件配置 跨域
后端程序的语言和库不同,配置 Access-Control-Allow-Origin 的方法也会有所不同。如果使用的是 Node.js 和 Express,可以添加 cors 中间件。cors 默认允许所有 跨域 请求。若要限制特定域名,可以为 origin 配置项传递一个字符串或数组,用以指定允许 跨域 的域名。
4. 配置前端开发环境
第二种方法是在前端开发环境中配置代理。由于 跨域 是浏览器的安全机制,如果绕过浏览器直接发送请求,就不会受到 跨域 保护机制的影响。因此,我们可以使用一个中转服务器来发送请求和接收响应,前端只需请求这个中转服务器,并保持与其 URL 一致即可。
5. 使用前端脚手架配置代理
大多数前端脚手架都支持代理配置,例如 vite、create-react-app 等。以 vite 为例,其自带的开发服务器支持设置代理。在 vite 的配置文件(config.js)中,我们可以添加代理配置,将对 /api 路径的请求代理转发到真实的后端服务路径,并根据需要对转发的 URL 进行重写。
6. 手动创建中转服务器
第三种方法适用于生产环境或开发服务器不支持代理的情况。我们可以手动创建一个中转服务器来代理请求。例如,将打包好的前端项目放置在 dist 目录下,入口文件为 index.html。使用 Express 创建服务器,负责发送前端页面并代理请求。
7. 配置代理服务器示例
我们可以将所有请求响应都返回到 dist 目录下的 index.html 文件,但对于 /api 路径,我们仍需配置代理。这时需要安装 http-proxy-middleware 依赖库,它与 webpack 底层使用的代理服务器相同,配置也几乎一致。不同之处在于 webpack 中的 rewrite 规则,在这里称为 pathRewrite。
8. 启动服务器展现前端页面
启动此服务器后,它将负责展示前端生产环境的页面。可以看到,即便移除后端的 跨域 支持,前端依然能够成功请求后端数据。除了 Express,还可以使用 Nginx 等专业服务器程序进行配置。具体配置方法可以参考相关文档。