React项目解决跨域问题

前言

跨域问题可以说是前后端分离项目中经常面对的问题,事实上解决跨域问题的方法也有很多种,本篇文章将针对React项目在开发以及部署到Nginx服务器后如何解决跨域问题进行讲解,希望对大家有所帮助。

一、开发模式——配置代理

我们在开发前端项目的时候,涉及到网络请求的部分难免会遇到跨域问题,由于是在本地开发,此时我们可以使用代理的方式来快速解决这个问题。

方法一:配置package.json

在package.json中追加如下配置,对应后端的ip和端口即可。

"proxy":"http://localhost:5000"
说明:
  1. 优点:配置简单,前端请求资源时可以不加任何前缀。
  2. 缺点:不能配置多个代理!!!如果说前端需要请求多个不同端口/域名的服务器的话,那么就不能通过这种方式解决。
  3. 工作方式:上述方式配置代理,当请求了3000不存在的资源时,那么该请求会转发给5000 (优先匹配前端资源)
方法二
  1. 第一步:创建代理配置文件

    在src下创建配置文件:src/setupProxy.js
    
  2. 编写setupProxy.js配置具体代理规则:

    const proxy = require('http-proxy-middleware')
    
    module.exports = function(app) {
      app.use(
        proxy('/api1', {  //api1是需要转发的请求(所有带有/api1前缀的请求都会转发给5000)
          target: 'http://localhost:5000', //配置转发目标地址(能返回数据的服务器地址)
          changeOrigin: true, //控制服务器接收到的请求头中host字段的值
          /*
             changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
             changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000
             changeOrigin默认值为false,但我们一般将changeOrigin值设为true
          */
          pathRewrite: {'^/api1': ''} //去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
        }),
        proxy('/api2', { 
          target: 'http://localhost:5001',
          changeOrigin: true,
          pathRewrite: {'^/api2': ''}
        })
      )
    }
    
说明:
  1. 优点:可以配置多个代理,可以灵活的控制请求是否走代理。
  2. 缺点:配置繁琐,前端请求资源时必须加前缀。

需要注意的是,在创建React脚手架的时候就已经默认有http-proxy-middleware模块了,如果没有的话,则手动执行:yarn add http-proxy-middleware来下载。需要注意的是,http-proxy-middleware模块的引入可能会因为版本问题而报错。如果上面的引入方式报错的话,那么就需要改为下面这种方式(对应使用到proxy的地方也要换成createProxyMiddleware),因为这个中间件最新的1.0.0版本已经对模块的引用作了明确的要求:

const { createProxyMiddleware } = require('http-proxy-middleware');

二、生产模式or正式部署到Nginx服务器上

我们知道,我们执行npm start能够把前端项目跑起来实际上是因为我们把项目放在了node帮我们启动的服务器上面,但是遗憾的是,我们原先配置的代理,在我们把打包后的文件部署到Nginx后,是不起作用的。
这个时候,我们就不得不重新面对跨域这个问题了,其实解决的问题也有很多

(1)如果是后台是Java项目的话,可以在后端配置同源Cors。
(2)如果后台不解决,那么我们可以通过Nginx的反向代理来解决这个问题

比如说,我们有个前端的请求是:ip:port/s1/custom/add,现在我们想要把/s1开头的请求转发到其他服务器来处理,我们可以这么配置:

 server {
        listen       3000;
        server_name  localhost;
      ...
        location /s1 {
           proxy_pass https://xxxx.xxxx.com/;
           rewrite "^/s1/(.*)$" /$1 break;
        }
}

当nginx匹配到/s1开头的请求时,就会重写请求路径,根据上面的正则配置,会取出/s1部分后面的内容作为新的请求路径,最终代理服务器拼接后的结果是:ip:port/custom/add。通过这种方式,我们就可以解决前端项目跨域请求的问题啦。

你可能感兴趣的:(React项目解决跨域问题)