• 在实际应用中,我们可能需要获取用户的ip地址,比如做异地登陆的判断,或者统计ip访问次数等,通常情况下我们使用request.getRemoteAddr()就可以获取到客户端ip,但是当我们使用了nginx作为反向代理后,使用request.getRemoteAddr()获取到的就一直是nginx服务器的ip的地址,那这时应该怎么办?
  • 而且有些场景做了一些客户端浏览器url的判断,比如,浏览器输入baidu.com是可以访问到百度的,但是输入!@#¥*.com有可能也是可以访问到百度,但是百度内部并不希望以这种方式访问(或者防止一些网络攻击),这时候应该怎么办?

其实nginx允许重新定义或者添加发往后端服务器的请求头。value可以包含文本、变量或者它们的组合。

默认情况下,有两个请求头会被重新定义:

proxy_set_header Host $proxy_host; //默认会将后端服务器的HOST填写进去

proxy_set_header Connection close;

我们可以通过设置nginx配置去调整转发报文的头部:

  • proxy_set_header X-real-ip $remote_addr;

    其中这个X-real-ip是一个自定义的变量名,名字可以随意取,这样做完之后,用户的真实ip就被放在X-real-ip这个变量里了,然后,在web端可以这样获取:

    request.getHeader("X-real-ip")

  • proxy_set_header X-Forwarded-For $remote_addr;

    同上。

    真实的显示出客户端原始ip。(nginx更多使用这条配置,X-Forwarded-For为默认字段,以下介绍均为默认字段)

  • proxy_set_header Host $http_host;

    如果想获取客户端访问的头部,可以这样来设置。

    但是,如果客户端请求头中没有携带这个头部,那么传递到后端服务器的请求也不含这个头部。

  • proxy_set_header Host $host;

    这个配置相当于上面配置的增强。

    它的值在请求包含"Host"请求头时为"Host"字段的值,在请求未携带"Host"请求头时为虚拟主机的主域名。

  • proxy_set_header Host $host:$proxy_port;

    服务器名和后端服务器的端口(访问端口)一起传送。

  • proxy_set_header <<<*>>> "";

    请求头的值为空,请求头将不会传送给后端服务器。

  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    在默认情况下经过proxy转发的请求,在后端看来远程地址都是proxy端的ip 。

    添加这条配置之后:

    意思是增加一个$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆盖,当然由于默认的X-Forwarded-For值是空的,所以我们总感觉X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,实际上当你搭建两台nginx在不同的ip上,并且都使用了这段配置,那你会发现在web服务器端通过request.getHeader("X-Forwarded-For")获得的将会是客户端ip第一台nginx的ip

    在第一台nginx中,使用

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    现在的$proxy_add_x_forwarded_for变量的"X-Forwarded-For"部分是空的,所以只有$remote_addr,而$remote_addr的值是用户的ip,于是赋值以后,X-Forwarded-For变量的值就是用户的真实的ip地址了。

    到了第二台nginx,也使用

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    现在的$proxy_add_x_forwarded_for变量,

    X-Forwarded-For部分包含的是用户的真实ip,

    $remote_addr部分的值是上一台nginx的ip地址,

    于是通过这个赋值以后现在的X-Forwarded-For的值就变成了"用户的真实ip,第一台nginx的ip"。

nginx proxy_set_header设置,自定义header的更多相关文章

  1. nginx proxy_set_header设置、自定义header

    先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; pr ...

  2. nginx 获取自定义header头部信息

    为了排查线上的bug,需要在nginx的日志中,打印客户端上传上来的header头部信息,同时头部信息是自定义的.在尝试多重方案后,找到解决方法: log_format dm '"$remo ...

  3. js ajax设置和获取自定义header信息的方法总结

    目录 1.js ajax 设置自定义header 1.1 方法一: 1.2 方法二: 2.js ajax 获取请求返回的response的header信息 3.js ajax 跨域请求的情况下获取自定 ...

  4. nginx反向代理proxy_set_header自定义header头无效

    公司使用nginx作为负载均衡,有时候需要自定义header头发送给后端的真实服务器. 想过去应该是非常的简单的事情. 例子如下: 设置代理服务器ip头   1 proxy_set_header X- ...

  5. nginx反向代理设置自定义错误页面

    为nginx反向代理设置自定义错误页面 转:https://blog.csdn.net/u014433030/article/details/77507839 如果我们的nginx配置了反向代理,如下 ...

  6. nginx通过自定义header属性来转发不同的服务

    一.背景 因为需要上线灰度发布,只要nginx接收到头部为: wx_unionid: 就会跳转到另外一个url,比如: 通过配置nginx 匹配请求头wx_unionid 来转发到灰度环境.核心:客户 ...

  7. nginx自定义header支持

    今天配置nginx的时候遇到一个问题,直接访问接口没有问题,但是通过nginx转发之后,总是报token失效,无法获取token值,发现请求头丢失了. 默认是不支持非nginx标准的用户自定义head ...

  8. Apache/nginx转发设置-分布式部署

    Apache转发设置1. Weblogic安装 Weblogic8和Weblogic10默认安装,选择完全安装即可,如果是Weblogic9则选择自定义安装,勾选WebService plugin 2 ...

  9. PHP 自定义header 参数获取的问题

    有的情况下,我们需要把参数放在Headers 里传递.比如说与提供给移动端的api,不能进行缓存的时候. 但是,自定义的header 经常是拿不到的. 如果是apache 的服务器,可以用 apach ...

随机推荐

  1. db2 -- 存储过程01

    接下来项目在技能可能偏向数据库方面,补习下. 学习写第一个db2在存储过程,记录下. ---- stored procedures code CREATE OR REPLACE PROCEDURE & ...

  2. 基于Linux的v4l2视频架构驱动编写

    其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自己找了一个关于编写Linux下的视频采集监控项目做,然后上学期刚开学的时候听师兄说,跟院长做项目,没做 ...

  3. oracle数据库服务介绍

    共有7个服务,这七个服务的含义分别为: 1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service ...

  4. STM32 软件模拟 IIC 代码,标准库、HAL库可用

    #ifndef _IIC_H #define _IIC_H #include "stdio.h" #include "stm32f1xx_hal.h" /* 定 ...

  5. JS 一个简单的隔行变色函数

    //输入要隔行变色的标签名 function setbgColor(tr){ var tr = document.getElementsByTagName("tr"); for(v ...

  6. spring security中当前用户信息

    1:如果在jsp页面中获取可以使用spring security的标签库 在页面中引入标签   1 <%@ taglib prefix="sec" uri="htt ...

  7. SQL SERVER-NULL

    SQL SERVER判断NULL的函数 ISNULL().NVL().IFNULL() 和 COALESCE() 函数 来自为知笔记(Wiz)

  8. 005推断两个字符串是否是变位词 (keep it up)

    写一个函数推断两个字符串是否是变位词. 变位词(anagrams)指的是组成两个单词的字符同样,但位置不同的单词.比方说, abbcd和abcdb就是一对变位词 这也是简单的题. 我们能够排序然后对照 ...

  9. 【MFC设置静态文本框背景为透明】

    视图类中加入OnCtlColor()函数: IDC_STATIC1为静态文本框ID HBRUSH CAngleView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT n ...

  10. 更换oracle 集群网卡(Changing a Network Interface)

     更换oracle 集群网卡(Changing a Network Interface) 假设换网卡前后 网卡名.ip,网关,子网掩码都不变的话,集群层面不许要做额外的操作. 一下操作为更换网卡后 ...