Nginx - 代理后端经过域名访问

目录
- 前言
- Nginx 根据域名反向代理
- Nginx proxy_pass 关于 '/' 的做用前端

 

1. 前言

接到一个需求,经过nginx 代理互联网上某一个页面,刚开始的时候以为很简单的,直接 proxy_pass 过去就完事了,测试了下仍是想太多。具体记录以下。nginx

 

2. Nginx 根据域名反向代理

web服务器一般有三种访问方式:web

  1. 基于ip
  2. 基于域名
  3. 基于端口

而互联网上暴露的网站多数都是经过 基于域名 的方式,若是直接经过解析后的IP访问,可能就没法访问到网站信息。我这里模拟了下这种方式,以下:浏览器

 

对应关系:bash

 

 

 

浏览器访问域名:服务器

 

 

 

浏览器访问ip地址:dom

 

 

 

如今问题来了,当你的 nginx 配置 proxy_pass 的时候,获得的是 域名返回的结果 仍是 ip地址返回的结果呢?这两种返回的结果彻底不一样。测试

在另外一台主机 [ 192.168.118.14 ] 上安装 nginx 并配置好 网站

 

配置nginx 方向代理 spa

 

 

 

经过浏览器访问 192.168.118.14

 

 

 查看日志信息:

192.168.118.41 - - [23/Jul/2019:20:09:12 +0800] "GET / HTTP/1.1" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36" "-" "upstream_addr":"112.2.3.66:80"

 

结合上面的反馈, 能够获得,当 nginx 反向代理域名,会根据启动时候解析出来的ip,加载到内存中,后面不会改变能够绑定hosts或者指定resolve服务器来固定ip

若是在使用 nginx 作反向代理的时候遇到以上相同的状况,解决办法是 设置一个 proxy_set_header

proxy_set_header Host "[domain]";

 

 

 

配置完成,nginx -s reload  浏览器访问:

 

 

 如今就获得想要的页面了。

 

3. Nginx proxy_pass 关于 '/' 的做用

有这样一个服务器访问以下:

访问 http://192.168.118.15 获得

 

 

访问 http://192.168.118.15/a/

 

 

在这台主机前端须要添加一个反向代理。配置以下:

 

第一种配置:

 

 

当这样配置的时候,访问 http://192.168.118.14/a/ 结果以下:

 

 

总结:

proxy_pass http://192.168.118.14/a/  --> http://192.168.118.15/

 

第二种配置:

 

 

当这样配置的时候,访问 http://192.168.118.14/a/ 结果以下:

 

 

总结:

proxy_pass http://192.168.118.14/a  --> http://192.168.118.15/

 

综上所述:

当 proxy_pass 不加 '/' 时, location uri 会追加到 proxy_pass http://domain/  后面;
当 proxy_pass 加 '/' 时,不会在 proxy_pass http://domain  后面追加任何uri

 

切记以上两条规则。

相关文章
相关标签/搜索