nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port区别解析

 更新时间:2024年03月14日 11:49:57   作者:明算科  
nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块,其中proxy_set_header指令就是该模块需要读取的配置文件,这篇文章主要介绍了nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port区别,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port区别

1.proxy_set_header设置的请求头是传递给后端服务器的

ngixn反向代理中proxy_set_header的设置:

 proxy_set_header       Host $http_host;
 proxy_set_header       X-Real-IP $remote_addr;
 proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header        X-Forwarded-Proto  $scheme;
 proxy_set_header        X-Forwarded-Uri  $request_uri;

解析:
1)$http_host:代理服务器本机IP。
2)$remote_addr:前一节点的IP,并不一定是用户的真实IP。
$proxy_host:代理服务器请求的host,即后端服务器/源站的IP,后端服务器有可能还是代理服务器。
$proxy_port:代理服务器请求的后端服务器的端口。
3)$http_x_real_ip:获取的是前一节点的X-Real-IP的值。
4)$proxy_add_x_forwarded_for:获取的是前一节点的X-Forwarded-For的值。

3. X-Forwarded-For 对应不同值:
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
当只有一层代理服务器的情况下,两者的X-Forwarded-For值?致,都是应用的真实IP。

区别
$remote_addr是前一节点的IP,并不一定是用户的真实IP。
$proxy_add_x_forwarded_for变量包含$http_x_forwarded_for与$remote_addr两部分,他们之间用逗号分开。

$proxy_port和$server_port区别:
$host:$proxy_port:Nginx监听的端口
$host:$server_port:服务真正访问的端口

补充:

nginx中proxy_set_header Host $host的作用及$proxy_host,$host与$http_host的区别

一、nginx中proxy_set_header Host $host的作用

  nginx为了实现反向代理的需求而增加了一个ngx_http_proxy_module模块。其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求体中的含义完全相同,除了Host外还有X-Forward-For。

  Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败【默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器】

  同理,X_Forward_For字段表示该条http请求是由谁发起的?如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来在反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。因此,在配置用作反向代理的nginx中一般会增加两条配置,修改http的请求头。

proxy_set_header Host $http_host;
proxy_set_header X-Forward-For $remote_addr;

  这里的$http_host和$remote_addr都是nginx的导出变量,可以在配置文件中直接使用。如果Host请求头部没有出现在请求头中,则$http_host值为空,但是$host值为主域名。因此,一般而言,会用$host代替$http_host变量,从而避免http请求中丢失Host头部的情况下Host不被重写的失误。

  X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 它不是RFC中定义的标准请求头信息,在squid缓存代理服务器开发文档中可以找到该项的详细介绍。标准格式如下:X-Forwarded-For: client1, proxy1, proxy2。

  这一HTTP头一般格式如下:X-Forwarded-For: client1, proxy1, proxy2。其中的值通过一个“逗号+空格”把多个IP地址区分开, 最左边(client1)是最原始客户端的IP地址, 代理服务器每成功收到一个请求,就把请求来源IP地址添加到右边。

  在上面这个例子中,这个请求成功通过了三台代理服务器:proxy1, proxy2 及 proxy3。请求由client1发出,到达了proxy3(proxy3可能是请求的终点)。请求刚从client1中发出时,XFF是空的,请求被发往proxy1;通过proxy1的时候,client1被添加到XFF中,之后请求被发往proxy2;通过proxy2的时候,proxy1被添加到XFF中,之后请求被发往proxy3;通过proxy3时,proxy2被添加到XFF中,之后请求的的去向不明,如果proxy3不是请求终点,请求会被继续转发。

鉴于伪造这一字段非常容易,应该谨慎使用X-Forwarded-For字段。正常情况下XFF中最后一个IP地址是最后一个代理服务器的IP地址, 这通常是一个比较可靠的信息来源。

二、proxy_set_header设置Host为$proxy_host,$host与$local_host的区别

  先来看下proxy_set_header的语法:proxy_set_header field value;

  默认值:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

  上下文:httpserverlocation

  作用:允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。 当且仅当当前配置级别中没有定义proxy_set_header指令时,会从上面的级别继承配置。 默认情况下,只有两个请求头会被重新定义:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

  nginx对于upstream默认使用的是基于IP的转发,因此对于以下配置:

upstream backend {  
        server 127.0.0.1:8080;  
    }  
    upstream crmtest {  
        server crmtest.aty.sohuno.com;  
    }  
    server {  
            listen       80;  
            server_name  chuan.aty.sohuno.com;  
            proxy_set_header Host $http_host;  
            proxy_set_header x-forwarded-for  $remote_addr;  
            proxy_buffer_size         64k;  
            proxy_buffers             32 64k;  
            charset utf-8;  
            access_log  logs/host.access.log  main;  
            location = /50x.html {  
                root   html;  
            }  
        location / {  
            proxy_pass backend ;  
        }  
        location = /customer/straightcustomer/download {  
            proxy_pass http://crmtest;  
            proxy_set_header Host $proxy_host;  
        }  
    }

  当匹配到 /customer/straightcustomer/download时,使用crmtest处理,到upstream就匹配到crmtest.aty.sohuno.com,这里直接转换成IP进行转发了。假如crmtest.aty.sohuno.com是在另一台nginx下配置的,ip为10.22.10.116,则$proxy_host则对应为10.22.10.116。此时相当于设置了Host为10.22.10.116。

// 如果想让Host是crmtest.aty.sohuno.com,则进行如下设置:
proxy_set_header Host crmtest.aty.sohuno.com;
// 如果不想改变请求头“Host”的值,可以这样来设置:
proxy_set_header Host $http_host;
// 但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。 
// 这种情况下,更好的方式是使用$host变量——它的值在请求包含“Host”请求头时为“Host”字段的值,在请求未携带“Host”请求头时为虚拟主机的主域名:
proxy_set_header Host       $host;
// 此外,服务器名可以和后端服务器的端口一起传送:
proxy_set_header Host $host:$proxy_port;
// 如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:
proxy_set_header Accept-Encoding "";

到此这篇关于nginx配置中$http_host、$host、$host:$proxy_port和$host:$server_port区别的文章就介绍到这了,更多相关nginx配置$http_host、$host、$host:$proxy_port和$host:$server_port内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • nginx配置解决跨域访问的方法详解

    nginx配置解决跨域访问的方法详解

    这篇文章主要为大家详细介绍了nginx如何配置解决跨域访问的方法,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • 利用Nginx反向代理解决跨域问题详解

    利用Nginx反向代理解决跨域问题详解

    这篇文章主要介绍了利用Nginx反向代理解决跨域问题详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Nginx 启动脚本/重启脚本代码

    Nginx 启动脚本/重启脚本代码

    Nginx 启动脚本 重启脚本,学习使用centos配置服务器的朋友可以参考下。
    2010-10-10
  • Nginx的信号控制

    Nginx的信号控制

    今天小编就为大家分享一篇关于Nginx的信号控制,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • nginx开启https配置之后网页无法访问的问题处理解决

    nginx开启https配置之后网页无法访问的问题处理解决

    最近新购服务器部署nginx之后按照之前的方式部署前端项目并配置https之后访问页面无法显示,本文主要介绍了nginx开启https配置之后网页无法访问的问题处理解决,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Node.js站点使用Nginx作反向代理时配置GZip压缩的教程

    Node.js站点使用Nginx作反向代理时配置GZip压缩的教程

    这篇文章主要介绍了Node.js站点使用Nginx作反向代理时配置GZip压缩的教程,文中演示了Node使用Express框架时的HTTP传输压缩配置,需要的朋友可以参考下
    2016-04-04
  • nginx的zabbix 5.0安装部署的方法步骤

    nginx的zabbix 5.0安装部署的方法步骤

    之前大家可能经常会基于apache去部署zabbix,但是这样会偶尔遇到一些问题,今天小编就带大家操作一下基于nginx的zabbix5.0的部署。感兴趣的可以了解一下
    2021-07-07
  • Nginx配置请求头携带原始请求信息的实现

    Nginx配置请求头携带原始请求信息的实现

    本文主要介绍了Nginx配置请求头携带原始请求信息的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Nginx监控模块(vts模块)详解

    Nginx监控模块(vts模块)详解

    国内用Nginx的比较多,下面这篇文章主要给大家介绍了关于Nginx监控模块(vts模块)的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • nginx配置多个前端项目实现步骤

    nginx配置多个前端项目实现步骤

    本文主要介绍了nginx配置多个前端项目实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论

?


http://www.vxiaotou.com