Nginx反向代理技巧

文章介绍了如何使用Nginx和webpack-dev-server的反向代理功能解决前端开发中的跨域问题,以及如何通过Nginx配置进行环境切换和端口绑定,实现开发、测试和生产环境的灵活切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx反向代理技巧

跨域

作为一个前端开发者来说不可避免的问题就是跨域,那什么是跨域呢?

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。浏览器的同源策略是指协议,域名,端口都要相同,其中有一个不同都会产生跨域

那如何解决跨域问题呢。跟后端商量一下也是可以通过CORS解决跨域问题的。但是一生要强的前端崽儿也是可以自己解决的。

webpack-dev-server反向代理

webpack-dev-server帮我们解决了这个痛点,它基于Node代理中间件http-proxy-middleware实现。

配置:

proxy: {
  '/api': {
    target: 'https://xxx.com', // 反向代理的目标服务
    changeOrigin: true,  // 开启后会虚拟一个请求头Origin
    cookieDomainRewrite: {
      '.xxx.com': 'localhost',
    },  // 修改响应头中 cookie 中的域名
  }
}

什么是反向代理

简单的说就是A需要向C发送请求,但是C不认识A自然是不愿意的,但是A认识B,A向B发送请求,可是B也不会返回什么东西但是他认识可以返回请求C,那么B再次向C发送请求,C看在B的面子上给B返回请求了,B再给A返回请求。。。。

具体到开发中就是,前端需要向https://xxx.com这个域名调用接口,但是前端开发环境启动项目是https://localhost:8080服务,直接调用接口会跨域。

所以前端需要做一层代理。从https://localhost:8080直接请求到https://xxx.com域名的接口,这对于前端来说应该是无感知的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sRWCdkQX-1692543165109)(C:\Users\Admin\Desktop\csdn\nginx代理.jpg)]

反向代理隐藏了真实的服务端;

切换环境debug

问题来了,如果我们正在开发新需求,但是此时有线上bug,那我们怎么办呐?

  1. 首先切换分支
  2. 修改target的域名
  3. 重新启动

每次到了第二步的时候我还得问问可以在哪个环境复现,这套流程下来虽然也不复杂但是如果可以省略是不是想想就更开心了。

抽离代理层

如果可以,前端不再需要把前端编译过程和服务代理目标捆绑在一起。不妨使用Nginx试试呢。

  1. 安装Nginx

  2. 固定前端代理

    proxy: {
      '/api': {
        target: '127.0.0.1:8080', // 固定IP
        changeOrigin: true,  // 开启后会虚拟一个请求头Origin
        cookieDomainRewrite: {
          '.xxx.com': 'localhost',
        },  // 修改响应头中 cookie 中的域名
      }
    }
    
  3. Nginx代理

 server {
    listen       8080;   // 这里是我们想要默认访问的端口
    server_name  127.0.0.1;   //  这里是想在浏览器里访问的地址

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass http://xxx.com;  //  这里是你在本地启动的时候的链接,例如localhost:4043,换个端口号就行了
       autoindex on;
    }
}
有了以上的配置,我们就可以将前端代理层和`Nginx`代理层解耦,前端固定通过本地`127.0.0.1:8080`访问后端接口,而具体接口是代理到开发环境、测试环境或是生产环境,由`Nginx`决定,只需要修改`nginx.conf`后重启即可。而`Nginx`热重启是非常快的,一条命令即可实现,几乎零等待时间。 
// windows下是这个命令
nginx.exe -s reload
// linux是这样的
nginx -s reload

固定端口

如果端口被占用怎么办呢?

最简单的办法是换个端口,但是换端口修改Nginx配置文件比修改代理更复杂些,所以只能另辟蹊径。那有没有什么方法可以再次转一下ip或者端口呢。答案是修改hosts文件

127.0.0.1 www.jia.com
当用户访问`www.jia.com`时给解析到`127.0.0.1`这个IP。所以修改Nginx配置监听`127.0.0.1`的`80`端口 
server {
    listen       80;   // 这里是我们想要默认访问的端口
    server_name  127.0.0.1;   //  这里是想在浏览器里访问的地址

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        proxy_pass http://xxx.com;  //  这里是你在本地启动的时候的链接,例如localhost:4043,换个端口号就行了
       autoindex on;
    }
}

然后修改本地代理配置

proxy: {
  '/api': {
    target: 'www.jia.com', // 固定IP
    changeOrigin: true,  // 开启后会虚拟一个请求头Origin
    cookieDomainRewrite: {
      '.xxx.com': 'localhost',
    },  // 修改响应头中 cookie 中的域名
  }
}
这样前端去访问接口域名`https://xxx.com`会被代理到`https://www.jia.com`,而`https://www.jia.com`被本地hosts解析到`127.0.0.1`,然后Nginx监听了`127.0.0.1`的`80`端口,请求转发到真实的后端服务! 

端去访问接口域名https://xxx.com会被代理到https://www.jia.com,而https://www.jia.com被本地hosts解析到127.0.0.1,然后Nginx监听了127.0.0.180端口,请求转发到真实的后端服务!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值