首页 > 系统相关 >nginx中proxy_set_header Host $host的作用及$proxy_host,$host与$http_host的区别

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

时间:2024-11-13 19:31:00浏览次数:1  
标签:set 请求 host header Host proxy

一、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 "";
https://www.cnblogs.com/goloving/p/13663843.html

 

标签:set,请求,host,header,Host,proxy
From: https://www.cnblogs.com/xututu6/p/18544633

相关文章

  • 使用 WinNTSetup 来安装 Windows 11 24H2 或 Windows Server 2025 可以帮助你快速创建
    使用WinNTSetup来安装Windows1124H2或WindowsServer2025可以帮助你快速创建和部署操作系统。以下是详细的步骤:1.准备工作在开始之前,确保你已经具备以下条件:WinNTSetup 工具。可以从官方网站或者其他可信的来源下载WinNTSetup。Windows1124H2或WindowsServe......
  • setupui.dll 找不到了:快速修复指南
    setupui.dll是Windows操作系统中的一个动态链接库文件,主要用于支持安装程序和系统设置功能。如果这个文件丢失,可能会导致一些应用程序或系统功能无法正常运行。如何修复setupui.dll文件丢失:1.使用系统文件检查器(SFC)工具:•打开命令提示符(以管理员身份)。•输入sfc......
  • A Method of Setting the LiDAR Field of View in NDT Relocation Based on ROI
    基于ROI的NDT重定位激光雷达视场设置方法期刊:MDPI单位:山东理工大学摘要:在高精度地图自动导航的重定位图中,激光雷达布放和视场选择起到检测车辆相对位置和位姿的作用。当激光雷达视场被遮挡或激光雷达位置错位时,很容易导致重定位丢失或重定位精度低。针对遮挡视场过大时ND......
  • c++(vector、map、list、deque、set)总结-面试
    目录1.vector2.deque3.list4.map5.set6.queue7.stack8.STL容器使用时机希望在面试和学习过程中可以帮助大家梳理重点C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。其中vector表示一段连续的内存,基于数组实现,list表示非连续......
  • ansible执行playbook报Host Key checking
    报错信息:(fastapi-ansible)root@WEB:/data/fastapi-ansible/project#ansible-playbook-ihostsping.yamlPLAY[PingTestPlaybook]*********************************************************************************************************************TASK[Pi......
  • LlamaIndex 中全局配置Settings的设置使用
    Settings是在LlamaIndex工作流/应用程序的索引和查询阶段使用的一组常用资源。您可以使用它来设置全局配置。局部配置(转换、llm、嵌入模型)可以直接传递到使用它们的接口中。Settings是一个简单的单例对象,存在于整个应用程序中。每当没有提供特定组件时,就使用Settings对象......
  • 【HAProxy05】企业级反向代理HAProxy调度算法之静态算法与动态算法
    HAProxy调度算法HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据不同的参数实现静态和动态算法相互转换。官方文档:http://cbonte.github.io/haproxy-dcon......
  • uniapp中uni.setTabBarItem方法在非tabbar页面使用会报错
    背景:uniapp在开发小程序多语言切换功能时,使用uni.setTabBarItem方法切换tabbar语言时报错,查阅文档发现微信小程序该功能只能在tabbar页面或其子页面中使用,不能在其他页面直接使用。解决:在tabbar页面中使用onShow方法监听切换语言设置,部分代码示例如下:<scriptsetup>import{......
  • C语言设置安全长跳转(setjmp/longjmp)
    #include<stdio.h>#include<stdlib.h>#include<setjmp.h>staticjmp_bufenv;voidd(void){ fprintf(stdout,"%s\n",__func__); fprintf(stdout,"dend\n"); longjmp(env,10);//跳转到设置点}voidc(void){ fprintf(std......
  • set 、multiset、unordered_set 和 map 、multimap、unordered_map
    序列式容器:比如:vector、list、deque、forward_list(C++11)等因为其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器:比如(树形结构的关联式容器):map、set、multimap、multiset等也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key,value>结构的键值对,......