Nginx反向代理中的各种问题

type
status
date
slug
summary
tags
category
icon
password

重定向302

触发302有两种情况,一种是后端服务302,一种是前端js 302。

后端302

notion image
上图A、B、C三台服务器处于同一局域网中,但是客户端只能访问A服务器。所以在A服务器上配置nginx反向代理服务器B,代理监听端口为9000,配置如下:
上面的配置,一旦B服务器发生302跳转,客户端就可能会直接访问其它不能访问的服务(比如B、C)
B服务器302重定向分为两种情况
1.重定向到自身
如果是通过相对路径重定向response.sendRedirect("/demo/test"); 基于上面的配置,可能会出现找不到端口,使用默认端口80的情况,即重定向地址为:http://192.168.124.92/demo/test
可通过下面配置解决:
如果是绝对路径重定向:response.sendRedirect("http://192.168.124.101:12000/demo/test"); 则上面的配置无法解决,有两种方式解决: 一种是通过正则表达式强制替换重定向地址(这种方式遇到重定向外部服务的情况会有问题),一种是让nginx主动跟随302的地址,把内容取给我们(这种方式基本上可以解决所有302的问题)。
2.重定向到外部服务
B服务可能会依赖C服务,所以B服务可能会重定向到外部服务。这种可以让nginx主动跟随302的地址,将内容拿到直接返回给客户端。
要理解这种方式的原理,首先得知道重定向的原理。
notion image
重定向的行为是发在客户端浏览器的,借助响应头Location。当浏览器收到服务器的响应时,发现响应头里存在Location,就会触发浏览器302到Location的地址里
而上面的解决办法原理是,nginx监听到301、302等重定向响应,则nginx主动去请求302的地址获取内容,再将内容返回给客户端浏览器,这样就禁止了客户端的所有302行为。
 
  • GitTalk

© aya 2024-2025