转载自https://www.jianshu.com/p/7a8a7eb3707a

1、浏览器直接访问服务,获取到的 Host 包含浏览器请求的 IP 和端口

测试服务器,centos 7

sudo pip install --upgrade pip

sudo pip install flask

把如下代码放到文件ngx_header.py, 并用python运行如下脚本,

IP 是 eth0的IP,请根据自己的服务器,做相应的修改, 笔者使用的是阿里云服务器,有公网IP,公网IP映射到本地eth0就是172.31.5.0

# cat ngx_header.py
from flask import Flask, request, jsonify
app = Flask(__name__) @app.route('/')
def get_host():
host = request.headers.get('Host')
return jsonify({'Host': host}), 200 if __name__ == '__main__':
app.run(host='172.31.5.0', port=5000) # python ngx_header.py

结果如下:

 2、配置 nginx 代理服务

2.1 不设置 proxy_set_header Host 时,浏览器直接访问 nginx,获取到的 Host 是 proxy_pass 后面的值,即 $proxy_host 的值,参考 http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
# cat ngx_header.conf
server {
listen 8090;
server_name _;
location / {
proxy_pass http://172.31.5.0:5000;
}
}

结果如下:

2.2 设置 proxy_set_header Host $host 时,浏览器直接访问 nginx,获取到的 Host 是 $host 的值,没有端口信息

# cat ngx_header.conf
server {
listen 8090;
server_name _;
location / {
proxy_set_header Host $host;
proxy_pass http://172.31.5.0:5000;
}
}

结果如下:

2.3 设置 proxy_set_header Host $host:$proxy_port 时,浏览器直接访问 nginx,获取到的 Host 是 $host:$proxy_port 的值 

# cat ngx_header.conf
server {
listen 8090;
server_name _;
location / {
proxy_set_header Host $host:$proxy_port;
proxy_pass http://172.31.5.0:5000;
}
}

结果如下:

2.4 设置 proxy_set_header Host $http_host 时,浏览器直接访问 nginx,获取到的 Host 包含浏览器请求的 IP 和端口

server {
listen 8090;
server_name _;
location / {
proxy_set_header Host $http_host;
proxy_pass http://172.31.5.0:5000;
}
}

结果如下:

2.5 设置 proxy_set_header Host $host 时,浏览器直接访问 nginx,获取到的 Host 是 $host 的值,没有端口信息。此时代码中如果有重定向路由,那么重定向时就会丢失端口信息,导致 404
# tree .
.
├── ngx_header.py
└── templates
├── bar.html
└── foo.html 1 directory, 3 files // ngx_header.py 代码
# cat ngx_header.py
from flask import Flask, request, render_template, redirect
app = Flask(__name__) @app.route('/')
def get_header():
host = request.headers.get('Host')
return render_template('foo.html',Host=host) @app.route('/bar')
def get_header2():
host = request.headers.get('Host')
return render_template('bar.html',Host=host) @app.route('/2bar')
def get_header3():
# 代码层实现的重定向
return redirect('/bar') if __name__ == '__main__':
app.run(host='172.31.5.0', port=5000)
// foo.html 代码
# cat templates/foo.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>foo</title>
</head>
<body>
Host: {{ Host }}
</br>
<a href="2bar"">页面跳转</a>
</body>
</html> // bar.html 代码
# cat templates/bar.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bar</title>
</head>
<body>
Host: {{ Host }}
</body>
</html> # python ngx_header.py # cat ngx_header.conf
server {
listen 8090;
server_name _;
location / {
proxy_set_header Host $host;
proxy_pass http://172.31.5.0:5000;
}
}

结果如下:

nginx proxy_set_header Host $host 和 proxy_set_header Host $http_host 的作用对比的更多相关文章

  1. kafka配置项host.name advertised.host.name

    遇到的问题: 在本机或者其他机器telnet IP 9092,通,使用域名也通,telnet 127.0.0.1 9092不通 host.name:按配置文件说明,是Kafka绑定的interface ...

  2. switch host 切换本地host

    百度网盘提取地址 提取码: 753r 下载后放到软件目录即可使用

  3. Nginx接收的host值会影响alias的规则匹配

    一般内网接收的HTTP请求都是内网唯一的网关传过来的,nginx的alias匹配会直接使用网关穿过的host值,而不是从URL解析出来的,从而导致的问题是,容器的alias相关Server_name规 ...

  4. Nginx详解二十:Nginx深度学习篇之HTTPS的原理和作用、配置及优化

    一.HTTPS原理和作用: 1.为什么需要HTTPS?原因:HTTP不安全1.传输数据被中间人盗用.信息泄露2.数据内容劫持.篡改 2.HTTPS协议的实现对传输内容进行加密以及身份验证 对称加密:加 ...

  5. (转载)Nginx/LVS/HAProxy三种主流负载均衡软件的对比

    原地址:http://www.ha97.com/5646.html PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些 ...

  6. uwsgi nginx与django之间的关系以及各自的作用

    首先要明确几个概念及其作用(注意大小写的区别): WSGI uWSGI uwsgi Nginx WSGI 是一种协议,不是任何包不是任何服务器,就和 TCP 协议一样.它定义了 Web 服务器和 We ...

  7. Nginx 301重定向域名

    为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名.网页的扩展名改变.网站域名改变等.如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个4 ...

  8. 很不错的NGINX URL重写实例

    转自:http://www.jbxue.com/article/2187.html 本文介绍nginx URL重写的相关知识,包括301重定向的内容等,希望对大家有所帮助. nginx rewrite ...

  9. nginx url 重写 [转]

    本文转自 http://www.jbxue.com/article/2187.html 本文介绍nginx URL重写的相关知识,包括301重定向的内容等,希望对大家有所帮助. nginx rewri ...

随机推荐

  1. kali安装—来自重装3次,创建了8个虚拟机的老安装师

    个人是有点生气的,但其实用好默认设置就很简单 我个人参考了好几个博客在这里附上链接: 1.其他人博客每步详细https://blog.csdn.net/chaootis1/article/detail ...

  2. window 下如何恢复被删除的mysql root账户及密码(mysql 8.0.17)

    不久前自学完完sql,下了mysql8.0.17,安装配置好后探索着,想着用root账户登上去能不能删除root账户呢,然后就想给自己一巴掌,,, 如何快速恢复root: 1.关闭mysql服务:wi ...

  3. opencv —— findContours、drawContours 寻找并绘制轮廓

    轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...

  4. 将Markdown编辑器搬进您的博客-让我们更优雅的书写文章

    各位小伙伴们,冷月今天给大家发一波福利.我们都知道markdown编辑器非常的好用,是我们写作的好帮手.这样的一款好用的文章编辑器,我们怎么才能让自己的博客也支持呢,冷月今天来教大家如何将Markdo ...

  5. [转]Android Adapter以及getView()方法的理解

    Android Adapter基本理解: 我的理解是: 1.一个有许多getter的类(就是getView(),getCount()....这些方法) 2.有多少个get方法?都是什么? 这些gett ...

  6. 修改 div 的滚动条的样式

    修改 div 的滚动条的样式 需要用到浏览器专属的伪元素,没有万能的办法,支持的浏览器不是很多. 假设有一个(你已经)设好宽高.定好位的 div, <div class="group- ...

  7. Auto-Encoder(自编码器)原理

    1.无监督学习 无监督学习和监督学习是机器学习的两个方向,监督学习主要适用于已经标注好的数据集(如mnist分类问题),无监督学习则是希望计算机完成复杂的标注任务,简单的解释就是——教机器自己学习,它 ...

  8. c#XML的基本使用

    创建XML文档 static void Main(string[] args) { //1.引入命名空间 //2.创建XML文档对象 XmlDocument xmldoc = new XmlDocum ...

  9. 剑指offer-面试题49-丑数-空间换时间

    /* 题目: 求从1开始的第n个丑数. */ /* 思路: 按顺序列出各个丑数. */ #include<iostream> #include<cstring> #includ ...

  10. mongodb4.xxx 安装,和基本配置

    .社区版 下载地址 ww.mongodb.com/download-center/community .配置环境变量 安装目录下的 bin 目录 ,C:\z_MongoDB\bin:配置到系统环境变量 ...