精华内容
下载资源
问答
  • 用户认证接口:根据客户端IP和port,进行IP反查和端口...请看 Nginx proxy_set_header Nginx proxy_set_header 允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义pr.

    用户认证接口:根据客户端IP和port,进行IP反查和端口范围确认,如符合则用户认证通过。
    当前使用的是Nginx负载均衡,从客户端到Nginx端 ip和port都对,从Nginx到应有服务器上-port端口变成很奇怪的端口号。
    疑问:Nginx往应有服务器上 是如何 传递 客户端IP和port 参数的呢?
    请看 Nginx proxy_set_header

    Nginx proxy_set_header
    允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义:

     

    proxy_set_header Host       $proxy_host;
    proxy_set_header Connection close;
    

    如果启用缓存,来自之前请求的头字段“If-Modified-Since”, “If-Unmodified-Since”, “If-None-Match”, “If-Match”, “Range”, 和 “If-Range” 将不会被代理服务器传递。
    一个不会变化的“Host”头请求字段可通过如下方式被传递:

     

    proxy_set_header Host       $http_host;
    

    然后,当字段不在请求头中就无法传递啦。在这种情况下,可通过设置Host变量,将需传递值赋给Host变量。

     

    proxy_set_header Host       $host;
    

    此外,服务器名称和端口一起通过代理服务器传递。

     

    proxy_set_header Host       $host:$proxy_port;
    

    如果请求头的存在空的字段将不会通过代理服务器传递出去。

     

    proxy_set_header Accept-Encoding "";
    

    总结:proxy_set_header 就是可设置请求头-并将头信息传递到服务器端。不属于请求头的参数中也需要传递时 重定义下就行啦。


    1. 测试 不设置 proxy_set_header
      Nginx配置

     

        upstream test {
            server 192.168.220.123:9099;
            server 192.168.220.123:58080;
        }
        server {
            listen    5800;
            server_name  192.168.220.123;
            root         /usr/share/nginx/html;
            include /etc/nginx/default.d/*.conf;
            location / {
                proxy_pass http://test;
            }
    

    测试jsp 想获取客户端IP、客户端port、代理服务器IP、代理服务器port

     

    <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
    <%
         String scheme = request.getScheme();
         String serverName = request.getServerName();
         String remoteName = request.getRemoteAddr();
         String realIP = request.getHeader("X-Forwarded-For");
         String realIP2 = request.getHeader("X-Real-IP");
         String Host = request.getHeader("Host");
         int port = request.getServerPort();
         int portR = request.getRemotePort();
         String requestURIC1 = scheme+"://"+realIP+":"+portR;
         String requestURIC2 = scheme+"://"+realIP2+":"+portR;
         String requestURIC3 = scheme+"://"+remoteName+":"+portR;
         String requestURI = scheme+"://"+serverName+":"+port;
    %>  
    客户端地址1:<%=requestURIC1 %>
    <br>
    客户端地址2:<%=requestURIC2 %>
    <br>
    客户端地址3:<%=requestURIC3%>
    <br>
    服务器地址1:<%=requestURI%>
    <br>
    服务器地址2:<%=Host%>
    <br>
    

    测试结果

     

    客户端地址1:http://null:58828
    客户端地址2:http://null:58828
    客户端地址3:http://192.168.220.123:58828
    服务器地址1:http://test:80
    服务器地址2:test
    

    Nginx日志

     

    192.168.220.177 -20508---5800 [25/Aug/2016:16:34:13 +0800] "GET /docs/test.jsp HTTP/1.1" 200 223 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" "-"
    

    其中客户端IP不能获取到,而通过request.getRemoteAddr();获取的IP是代理服务器IP,而不是客户端IP,而在nginx中$remote_addr变量的值是客户端的IP,可见remoteaddr没有传递。
    而server_port值也不对,当前值为5800,当前打印出的是80。
    而当前代理为http://test 所有通过host得到的是test。
    客户端port也获取不到值为20508,可传给应用的是58828

    1. 测试 设置proxy_set_header
      Nginx 配置

     

        upstream test {
            server 192.168.220.123:9099;
            server 192.168.220.123:58080;
        }
        server {
            listen    5800;
            server_name  192.168.220.123;
            root         /usr/share/nginx/html;
            include /etc/nginx/default.d/*.conf;
            location / {
                proxy_pass http://test;
                proxy_set_header Host $host:$server_port;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Real-PORT $remote_port;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    

    测试页面改成:

     

    <%@page contentType="text/html; charset=UTF-8" trimDirectiveWhitespaces="true"%>
    <%
         String scheme = request.getScheme();
         String serverName = request.getServerName();
             String remoteName = request.getRemoteAddr();
             String realIP = request.getHeader("X-Forwarded-For");
             String realIP2 = request.getHeader("X-Real-IP");
             String Host = request.getHeader("Host");
             int port = request.getServerPort();
             int portR = request.getRemotePort();
             String portR2 = request.getHeader("X-Real-Port");
             String requestURIC1 = scheme+"://"+realIP+":"+portR;
             String requestURIC2 = scheme+"://"+realIP2+":"+portR;
             String requestURIC3 = scheme+"://"+remoteName+":"+portR;
             String requestURI = scheme+"://"+serverName+":"+port;
    %>
    客户端地址1:<%=requestURIC1 %>
    <br>
    客户端地址2:<%=requestURIC2 %>
    <br>
    客户端地址3:<%=requestURIC3%>
    <br>
    服务器地址1:<%=requestURI%>
    <br>
    服务器地址2:<%=Host%>
    <br>
    客户端port2:<%=portR2%>
    <br>   
    

    测试结果:

     

    客户端地址1:http://192.168.220.177:21548
    客户端地址2:http://192.168.220.177:21548
    客户端地址3:http://192.168.220.123:21548
    服务器地址1:http://192.168.220.123:5800
    服务器地址2:192.168.220.123:5800
    客户端port2:20604
    

    Nging日志:

     

    192.168.220.177 -20604---5800 [25/Aug/2016:16:38:42 +0800] "GET /docs/test.jsp HTTP/1.1" 200 275 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" "-"
    

    除request.getRemoteAddr();获取的值不对外,其他值都是对的。
    getRemoteAddr获取的是代理的请求地址。
    因重定义了host,所以test值被改写成代理服务器IP。
    因重定义了 X-Real-PORT-并传递$remote_port,客户端port也获取正确啦。
    弄清楚是怎么传值的,正确的使用Nginx又向前进了一步。

    展开全文
  • nginx反向代理中的proxy_set_header

    千次阅读 2019-09-06 15:51:14
    nginx作为反向代理时,proxy_set_header设置的请求头是传递给后端服务器的。 为什么? 场景一: 后端服务器想要知道用户的真实IP,就可以通过proxy_set_header来传递给后端服务器。 场景二: 后端服务器想...

     

    是什么?

    nginx作为反向代理时,proxy_set_header设置的请求头是传递给后端服务器的。

     

    为什么?

    场景一:

    后端服务器想要知道用户的真实IP,就可以通过proxy_set_header来传递给后端服务器。

    场景二:

    后端服务器想知道这次HTTP请求的整个流程,也可以通过proxy_set_header来传递给它。

     

    怎么用?

    在nginx配置文件中的http, server, location中使用。

     

    proxy_set_header Host $host。

    proxy_set_header X-Real-IP $remote_addr

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

     

    说明:

    $host:代理服务器本身IP。

    $remote_addr:前一节点的IP,并不一定是用户的真实IP。

    $proxy_host:代理服务器请求的host,即后端服务器/源站的IP,后端服务器有可能还是代理服务器。

    $proxy_port:代理服务器请求的后端服务器的端口。

     

    $http_x_real_ip:获取的是前一节点的X-Real-IP的值。

    $http_x_forwarded_for:获取的是前一节点的X-Forwarded-For的值。

     

     

    详解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两部分,他们之间用逗号分开。

     

     

    XFF的格式

    X-Forwarded-For: client, proxy1, proxy2

     

    如果一个HTTP请求到达web服务器之前,经过了三个代理Proxy1、Proxy2、Proxy3,IP分别为IP1、IP2、IP3,用户真实IP为IP0,那么按照XFF标准,web服务端最终会收到以下信息:

    X-Forwarded-For: IP0, IP1, IP2

     

    XFF最多保留3个IP,所以三层代理的时候,web服务器拿不到Proxy3的IP,此时可以通过$remote_addr获取web服务器的前一节点的IP,即Proxy3的IP。

     

    伪造的XFF

    curl localhost/index.html -H 'X-Forwarded-For: unknown'

    那么后端web服务器拿到的$http_x_forwarded_for就是包含了伪造的信息。

    解决方法:

    由于我们第一层代理服务器nginx的IP是固定的,所以我们后端web服务器获取$http_x_forwarded_for的时候,取第一层代理服务器之前的一个IP,就是用户的真实IP了。

     

     

    场景说明

    win10用户的IP:192.168.12.1

    nginx-12作为反向代理服务器:192.168.12.12

    nginx-13作为后端web服务器:192.168.12.13

     

    场景1

    两台nginx都使用proxy_set_header X-Forwarded-For $remote_addr

     

    1.首先对比nginx-12和nginx-13的日志格式:

    nginx-12代理服务器的日志格式:

    log_format main '$remote_addr - $remote_user [$time_local] "$request" $http_host '

    '$status $body_bytes_sent "$http_referer" '

    '"$http_user_agent" "$http_x_forwarded_for"';

     

    nginx-13后端服务器的日志格式:

    log_format main '$remote_addr "$http_x_real_ip" - $remote_user [$time_local] "$request" "$http_host" '

    '$status $body_bytes_sent "$http_referer" '

    '"$http_user_agent" "$http_x_forwarded_for"';

     

    2.访问http://192.168.12.12:8080/:

    nginx-12的日志显示:

    192.168.12.1 - - [06/Sep/2019:08:08:40 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.12.12:8080 304 0 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" "-"

     

    说明:

    最后一个字段"$http_x_forwarded_for"对应的为空值,因为nginx-12之前的服务器并没有传这个值。

     

    nginx-13的日志显示:

    192.168.12.12 "192.168.12.1" - - [06/Sep/2019:08:08:40 +0800] "GET /index.html HTTP/1.0" "192.168.12.12:80" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" "192.168.12.1"

     

    说明:

    最后一个字段"$http_x_forwarded_for"拿到的是nginx-12的X-Forwarded-For,而nginx-12的X-Forwarded-For的值是nginx-12的$remote_addr,即192.168.12.1。

     

    场景2

    两台nginx都使用proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

     

    1.访问http://192.168.12.12:8080/

    nginx-12的日志显示:

    192.168.12.1 - - [06/Sep/2019:08:08:40 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.12.12:8080 304 0 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" "192.168.12.1"

     

    说明:

    $http_x_forwarded_for只拿到了"192.168.12.1"这个地址,即客户端的真实IP。

     

    nginx-13的日志显示:

    192.168.12.12 "192.168.12.1" - - [06/Sep/2019:08:08:40 +0800] "GET /index.html HTTP/1.0" "192.168.12.12:80" 304 0 "-" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0" "192.168.12.1,192.168.12.12"

     

    说明:

    $http_x_forwarded_for拿到了"192.168.12.1,192.168.12.12",即“客户端的真实IP,前面代理服务器的IP”。

     

    展开全文
  • 但是,proxy_set_header设置为7010端口,所有的请求都到了10.0.0.100:8080这台应用,就无法起到负载均衡的作用. 问题来了,要实现如下功能,应如何配置呢. 1,用户必须统一入口(10.0.0.0.102). 2,请求必须经过10.32.4...
  • 不设置 proxy_set_header Host 不设置 proxy_set_header Host 时,浏览器直接访问 nginx,获取到的 Host 是 proxy_pass 后面的值,即 $proxy_host 的值,参考 ...

    一、不设置 proxy_set_header Host

    不设置 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;
        }
    }
    

    结果如下:返回proxy_pass 后面的值
    在这里插入图片描述

    二、设置proxy_set_header Host $host

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

    结果如下:不再是 proxy_pass代理的ip地址了, 不包含端口
    在这里插入图片描述


    三、设置proxy_set_header Host $http_host

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

    结果如下:不再是 proxy_pass代理的ip地址了, 包含端口
    在这里插入图片描述

    提示: 设置 proxy_set_header Host $host 时,浏览器直接访问 nginx,获取到的 Host 是 $host 的值,没有端口信息。此时代码中如果有重定向路由,那么重定向时就会丢失端口信息,导致 404

    展开全文
  • 1.首选说明设置proxy_set_header的作用 允许重新定义或者添加发往后端服务器的请求头 2$host 和$http_host 和$proxy_host的说明 $proxy_host 自然是 proxy_pass后面跟着的host 比如一个请求 ...

    1.首选说明设置proxy_set_header的作用

          允许重新定义或者添加发往后端服务器的请求头

    2 $host 和 $http_host 和$proxy_host的说明

          $proxy_host 自然是 proxy_pass后面跟着的host

           比如一个请求 https://zhidao.baidu.com/question/22908463.html
           Request.ServerVariables("HTTP_HOST") 可以获得HTTP_HOST请求标题:zhidao.baidu.com

          $http_host始终等于HTTP_HOST请求标题

          $host等于$http_host,小写并且没有端口号(如果存在),除非HTTP_HOST不存在或是空值。在这种情况下,$host等于server_name

    3 proxy_set_header配置说明

       location /{
            proxy_pass                  http://backend; 
            proxy_set_header            Host $host;
            proxy_set_header            X-real-ip $remote_addr;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        request.Header.Get("X-Real_IP"):获取用户真实ip

       假设有三次代理:request.Header.Get("X-Forwarded-For")  client1, proxy1, proxy2,以逗号隔开各个地址

    注意:在nginx的配置文件中,如果当前模块中没有proxy_set_header的设置,则会从上级别继承配置。继承顺序为:http, server, location。

    展开全文
  • 如果设置proxy_set_header,如 proxy_set_header host $host; 比如示例4,请求到后端的服务器完整uri为:http://www.aminglinux.com/linux/a.html proxy_set_header X-Real-IP $remote_addr;和proxy_set_...
  • proxy_set_header 属性说明

    万次阅读 2018-08-18 09:38:56
     proxy_set_header Proxy_Host $proxy_host; #proxy_pass of ip or houtai server of ip ,要转发的地址10.30.30.131(proxy_pass http://10.30.30.131:8080;)  proxy_set_header Proxy_Port $proxy_port; #proxy...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: ...
  • proxy_set_header Connection "upgrade"; proxy_set_header Upgrade $http_upgrade; 具体可以参考此处:一次 Nginx proxy_set_header 故障问题解析和延升     ...
  • proxy_set_header的设置

    千次阅读 2017-08-18 12:53:44
    先来看下proxy_set_header的语法语法:proxy_set_headerfieldvalue;默认值:proxy_set_headerHost$proxy_host;proxy_set_headerConnectionclose;上下文:http,server,location允许重新定义或者添加发往后端服务器的请求...
  • 1、proxy_set_header设置的请求头是传递给后端服务器的 2、ngixn反向代理中proxy_set_header的设置: proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-...
  • nginx中proxy_set_header Host $host的作用

    千次阅读 2017-11-14 10:05:57
    其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而...
  • 1.1 proxy_buffer_size 1.2 proxy_buffering 1.3 proxy_buffers 1.4 proxy_busy_buffers_size 1.5 proxy_max_temp_file_size 1.6 proxy_temp_file_write_size 1.7 缓冲区配置实例 2. 常用配置项 ...
  • 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的...proxy_set_header Host js.test.com; proxy_pass http://js.test.com/; } 如上面的配置,如果请求的url是http://servername/wangshibo/tes
  • proxy_pass方法主要用于Nginx的代理,其使用方法比较灵活多样,不同的配置也会起到不同的效果,我们来分别了解一下。 1、简单的代理 我们来看一下下面这段代码,作用是在访问域名www.abc.com时,通过Nginx代理到了...
  • nginx location proxy_pass详解

    万次阅读 2019-04-29 11:55:16
    在nginx中配置proxy_pass时,如果在proxy_pass后面的url加/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分给代理走。 下面四种情况分别用...
  • nginx rewrite与proxy_pass详解

    千次阅读 2019-01-17 17:22:54
    最近接触到了nginx的 proxy_pass 与 rewrite,在这里记录一下,学习学习。 说明 rewrite syntax: rewrite regex replacement [flag] Default: — Context: server, location, if 如果正则表达式(regex)匹配到...
  • #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #proxy_set_header X-Forwarded-For $http_x_forwarded_for; #proxy_set_header REMOTE_ADDR $remote_addr; #proxy_set_header RealIP $remote_...
  • 一、 Nginx 配置 proxy_pass 后 返回404问题 故障解决和定位 1.1、 问题 在一次生产涉及多次转发的配置中, 需求是下面的图: image 在配置好了 proxy_pass 之后,请求 ...我们的默认的 Nginx的 proxy_set_hea
  • 详解:于proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置成允许转发。例如: view plain print ? // 允许重定向   proxy_pass_header ...
  • Nginx之ngx_http_proxy_connect_module模块

    千次阅读 2019-09-13 00:06:44
    近期由于项目需要使用到https正向代理,而nginx官方模块仅...ngx_http_proxy_connect_module模块主要用于隧道SSL请求的代理服务器 GitHub地址:http://www.github.com/chobits/ngx_http_proxy_connect_module ngi...
  • ngx_http_proxy_module 模块功能 转发请求至另一台主机 1、proxy_pass URL;... 可用位置:location, if... 注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机 server { ... ...
  • # 对 “/” 启用反向代理 location / { proxy_pass http://127.0.0.1:3000; # 设置要代理的 uri,注意最后的 /。...proxy_set_header X-Real-IP $remote_addr; # 获取用户的真实 IP 地址 #后端的Web服务器可以...
  • Nginx作为代理服务

    2019-06-15 22:34:00
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; #允许客户端请求的最大单文件字节数 client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数 proxy_...
  • 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。... 概述:  本篇主要总结Nginx实现反向代理和...ngx_http_proxy_module Nginx实现反向代理...
  • nginx配置文件详解

    2018-03-19 15:15:01
    Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:用户 组。window下不指定 worker_processes 8; 工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。 error_log ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,961
精华内容 4,784
关键字:

proxy_set_header详解