精华内容
下载资源
问答
  • 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”。

     

    展开全文
  • nginx之配置proxy_set_header

    千次阅读 2019-01-03 09:43:23
    nginx之配置proxy_set_header win10客户端请求web服务,win10的ip:192.168.223.1 nginx作为反向代理服务器:192.168.223.136 nginx作为后端web服务器:192.168.223.137 前提条件:配置nginx转发到后端服务器 ...

    nginx之配置proxy_set_header
    win10客户端请求web服务,win10的ip:192.168.223.1

    nginx作为反向代理服务器:192.168.223.136

    nginx作为后端web服务器:192.168.223.137

    前提条件:配置nginx转发到后端服务器

    server {
    listen 8080;
    server_name 192.168.223.136;
    location / {
    root "/www/html";
    index index.html;
    #auth_basic "required auth";
    #auth_basic_user_file "/usr/local/nginx/users/.htpasswd";
    error_page 404 /404.html;
    }
    location /images/ {
    root "/www";
    rewrite ^/images/bbs/(.*\.jpeg)$ /images/$1 break;
    rewrite ^/images/www/(.*)$ http://192.168.223.136/$1 redirect;
    }
    location /basic_status {
    stub_status;
    }
    location ^~/proxy_path/ {
    root "/www/html";
    index index.html;
    proxy_pass http://192.168.223.137/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    #proxy_set_header X-Forwarded-For $remote_addr;
    
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }
    
    location ^~/proxy_path/ {
    root "/www/html";
    index index.html;
    proxy_pass http://192.168.223.137/;
    

    将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器192.168.223.137

    现在一一测试各个proxy_set_header设置的变量的内容

    1、proxy_set_header Host $host;

    将136代理服务器,137后端服务器的log_format修改为如下:

    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"';
    

    proxy_set_header Host $host;这里的Host变量的值对应的就是日志中的$http_host 的值
    当win10用户访问http://192.168.223.136:8080/proxy_path/index.html时
    查看代理服务器和后端服务器的地址,可以发现$http_host对应的值为192.168.223.136:8080
    192.168.223.1 - - [18/Jul/2017:10:21:25 +0800] “GET /favicon.ico HTTP/1.1” 192.168.223.136:8080 404 24 “http://192.168.223.136:8080/proxy_path/index.html” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”
    由于我将后端服务器关闭了,所以出现502网管错误:

    然后开启137后端nginx,查看日志:

    192.168.223.136 “192.168.223.1” - - [17/Jul/2017:17:06:44 +0800] “GET /index.html HTTP/1.0” “192.168.223.136” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko” “192.168.223.1”

    即验证了proxy_set_header Host $host; $host就是nginx代理服务器,也就是win10客户端请求的host

    2、proxy_set_header Host $proxy_host;

    将设置修改为上述proxy_host然后重启ngxin代理服务器136

    [root@wadeson nginx]# sbin/nginx -s reload

    重新请求代理页面:http://192.168.223.136:8080/proxy_path/index.html,然后日志如下:

    首先查看136代理服务器的日志:

    192.168.223.1 - - [18/Jul/2017:10:30:12 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

    因为win10是136的客户端,请求的host为192.168.223.136:8080,而nginx代理服务器作为137后端服务器的客户端,将请求的报文首部重新封装,将proxy_host封装为请求的host

    那么137上面日志请求的host就是其自身,proxy_host就是代理服务器请求的host也就是后端服务器137

    192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:30:12 +0800] “GET /index.html HTTP/1.0” “192.168.223.137” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

    3、**proxy_set_header Host $host:$proxy_port;**

    了解了上面的知识,那么此处对应的host就知道代表的啥了,$host代表转发服务器,$proxy_port代表136转发服务器请求后端服务器的端口,也就是80

    于是观察136、137的日志进行验证:

    192.168.223.1 - - [18/Jul/2017:10:38:38 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

    192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:38:38 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

    4、proxy_set_header X-Real-IP $remote_addr;

    $remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip

    nginx转发136服务器日志格式为:

    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后端137服务器的日志格式:

    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"';
    

    两者区别在于"$http_x_real_ip",添加了这个变量的值

    重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

    136的日志:

    192.168.223.1 - - [18/Jul/2017:10:45:07 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”

    137的日志:

    192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:45:07 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

    红色标记的就是"$http_x_real_ip"的值,即可以看见用户真实的ip,也就是客户端的真实ip

    5、proxy_set_header X-Forwarded-For $remote_addr;

    理解了上面的含义那么这个封装报文的意思也就请求了

    首先还是比对136和137的日志格式:

    136代理服务器的日志格式:

    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"';
    

    137后端服务器的日志格式:

    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"';
    

    重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

    136的日志显示:

    192.168.223.1 - - [18/Jul/2017:10:51:25 +0800] “GET /proxy_path/index.html HTTP/1.1” 192.168.223.136:8080 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “-”,最后一个字段"$http_x_forwarded_for"对应的为空值

    137的日志显示:

    192.168.223.136 “192.168.223.1” - - [18/Jul/2017:10:51:25 +0800] “GET /index.html HTTP/1.0” “192.168.223.136:80” 304 0 “-” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36” “192.168.223.1”

    可以看出137后端服务器成功的显示了真实客户端的ip

    6、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    5、6两者的区别:

    在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip

    但是区别在于:

    $proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

    举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

    在第一台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(获取用户ip)

    千次阅读 2019-06-27 14:21:51
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } location ^~/proxy_path/ { root "/www/html"; index index.html; proxy_pass http://192.168.223.137/; 将左侧匹配到的/proxy_path/...

    win10客户端请求web服务,win10的ip:192.168.223.1

    nginx作为反向代理服务器:192.168.223.136

    nginx作为后端web服务器:192.168.223.137

    前提条件:配置nginx转发到后端服务器

    server {
    listen 8080;
    server_name 192.168.223.136;
    location / {
    root "/www/html";
    index index.html;
    #auth_basic "required auth";
    #auth_basic_user_file "/usr/local/nginx/users/.htpasswd";
    error_page 404 /404.html;
    }
    location /images/ {
    root "/www";
    rewrite ^/images/bbs/(.*\.jpeg)$ /images/$1 break;
    rewrite ^/images/www/(.*)$ http://192.168.223.136/$1 redirect;
    }
    location /basic_status {
    stub_status;
    }
    location ^~/proxy_path/ {
    root "/www/html";
    index index.html;
    proxy_pass http://192.168.223.137/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    #proxy_set_header X-Forwarded-For $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    location ^~/proxy_path/ {
    root "/www/html";
    index index.html;
    proxy_pass http://192.168.223.137/;

    将左侧匹配到的/proxy_path/开头的url全部转发到后端服务器192.168.223.137

    现在一一测试各个proxy_set_header设置的变量的内容

    1、proxy_set_header Host $host;

    将136代理服务器,137后端服务器的log_format修改为如下:

    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"';

    proxy_set_header Host $host;这里的Host变量的值对应的就是日志中的$http_host 的值

    当win10用户访问http://192.168.223.136:8080/proxy_path/index.html

    查看代理服务器和后端服务器的地址,可以发现$http_host对应的值为192.168.223.136:8080

    192.168.223.1 - - [18/Jul/2017:10:21:25 +0800] "GET /favicon.ico HTTP/1.1" 192.168.223.136:8080 404 24 "http://192.168.223.136:8080/proxy_path/index.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"

    由于我将后端服务器关闭了,所以出现502网管错误:

    然后开启137后端nginx,查看日志:

    192.168.223.136 "192.168.223.1" - - [17/Jul/2017:17:06:44 +0800] "GET /index.html HTTP/1.0" "192.168.223.136" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "192.168.223.1"

    即验证了proxy_set_header Host $host;  $host就是nginx代理服务器,也就是win10客户端请求的host

    2、proxy_set_header Host $proxy_host;

    将设置修改为上述proxy_host然后重启ngxin代理服务器136

    [root@wadeson nginx]# sbin/nginx -s reload

    重新请求代理页面:http://192.168.223.136:8080/proxy_path/index.html,然后日志如下:

    首先查看136代理服务器的日志:

    192.168.223.1 - - [18/Jul/2017:10:30:12 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.223.136:8080 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"

    因为win10是136的客户端,请求的host为192.168.223.136:8080,而nginx代理服务器作为137后端服务器的客户端,将请求的报文首部重新封装,将proxy_host封装为请求的host

    那么137上面日志请求的host就是其自身,proxy_host就是代理服务器请求的host也就是后端服务器137

    192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:30:12 +0800] "GET /index.html HTTP/1.0" "192.168.223.137" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.223.1"

    3、proxy_set_header Host $host:$proxy_port;

    了解了上面的知识,那么此处对应的host就知道代表的啥了,$host代表转发服务器,$proxy_port代表136转发服务器请求后端服务器的端口,也就是80

    于是观察136、137的日志进行验证:

    192.168.223.1 - - [18/Jul/2017:10:38:38 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.223.136:8080 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"

    192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:38:38 +0800] "GET /index.html HTTP/1.0" "192.168.223.136:80" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.223.1"

    4、proxy_set_header X-Real-IP $remote_addr;

    将$remote_addr的值放进变量X-Real-IP中,此变量名可变,$remote_addr的值为客户端的ip

    nginx转发136服务器日志格式为:

    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后端137服务器的日志格式:

    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"';

    两者区别在于"$http_x_real_ip",添加了这个变量的值

    重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

    136的日志:

    192.168.223.1 - - [18/Jul/2017:10:45:07 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.223.136:8080 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-"

    137的日志:

    192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:45:07 +0800] "GET /index.html HTTP/1.0" "192.168.223.136:80" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.223.1"

    红色标记的就是"$http_x_real_ip"的值,即可以看见用户真实的ip,也就是客户端的真实ip

    5、proxy_set_header X-Forwarded-For $remote_addr;

    理解了上面的含义那么这个封装报文的意思也就请求了

    首先还是比对136和137的日志格式:

    136代理服务器的日志格式:

    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"';

    137后端服务器的日志格式:

    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"';

    重新请求需要访问的地址http://192.168.223.136:8080/proxy_path/index.html

    136的日志显示:

    192.168.223.1 - - [18/Jul/2017:10:51:25 +0800] "GET /proxy_path/index.html HTTP/1.1" 192.168.223.136:8080 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "-",最后一个字段"$http_x_forwarded_for"对应的为空值

    137的日志显示:

    192.168.223.136 "192.168.223.1" - - [18/Jul/2017:10:51:25 +0800] "GET /index.html HTTP/1.0" "192.168.223.136:80" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" "192.168.223.1"

    可以看出137后端服务器成功的显示了真实客户端的ip

    6、proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    5、6两者的区别:

    在只有一个代理服务器的转发的情况下,两者的效果貌似差不多,都可以真实的显示出客户端原始ip

    但是区别在于:

     

    $proxy_add_x_forwarded_for变量包含客户端请求头中的"X-Forwarded-For",与$remote_addr两部分,他们之间用逗号分开。

     

    举个例子,有一个web应用,在它之前通过了两个nginx转发,www.linuxidc.com 即用户访问该web通过两台nginx。

     

    在第一台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”,这样就清楚了吧。

    原文url:https://www.cnblogs.com/jsonhc/p/7199295.html?utm_source=itdadao&utm_medium=referral

    展开全文
  • proxy_set_header 属性说明

    万次阅读 2018-08-18 09:38:56
     proxy_set_header X-Referer $http_referer;  proxy_set_header Cookie $http_cookie;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #all access client ip 。从客户访问到到最后的后台...

    物理机的访问的ip:221.221.1.100

    对外开放的外网ip:200.200.19.53

    nginx:10.30.30.109:8314

    代理后台服务的ip:10.30.30.131:8080

    server{
            listen 8314;
            server_name 200.200.19.53;
            #server_name 10.30.30.109;
            location /jettech {
                     proxy_pass http://10.30.30.131:8080;
                     proxy_pass_request_headers  off;
                     proxy_cache_valid  200 206 304 301 302 10d;
                     proxy_cache_key $uri;
                     proxy_ignore_headers Set-Cookie Cache-Control;
                     proxy_hide_header Cache-Control;
                     proxy_hide_header Set-Cookie;
                     proxy_set_header   proxy_nginx_ip   $host; #server_name of ip,200.200.19.53
                     proxy_set_header   X-Real-IP_Client_Access  $remote_addr; #access clint host or yourself of ip。用户访问的时候的自己电脑ip地址221.221.1.100
                     proxy_set_header   X-Real-Port_Client_Access  $remote_port; #access clint port。用户访问的时候的自己电脑端口,随机分配动态变化
                     proxy_set_header   X-Real-User_Client_Access  $remote_user ; #access clint user。客户的用户名
                     proxy_set_header   X-Referer $http_referer;
                     proxy_set_header   Cookie $http_cookie;
                     proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for; #all access client ip 。从客户访问到到最后的后台服务所经理的所有节点的ip汇总221.221.1.100,10.30.30.109,...
                     proxy_set_header   X-FORWARDED-HOST $server_addr; #nginx of ip 10.30.30.109
                     proxy_set_header   proxy_nginx_hostname  $hostname; # nginx of hostname,k8s-test-nginx-109
                     proxy_set_header   X-FORWARDED-PORT $server_port; #nginix of port or nginx listen of port,8314
                     proxy_set_header   X-FORWARDED-NAME $server_name; #serve_name of ip or $host
                     proxy_set_header   X-FORWARDED-PROTO $server_protocol;
                     proxy_set_header   X-NGINX_VER $nginx_version;
                     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_pass of port ou houtai server of port,要转发的端口8080(proxy_pass http://10.30.30.131:8080;)
                     proxy_http_version 1.1;
                     #开启对http1.1支持
                     proxy_set_header Connection "";
                     # 设置Connection为空串,以禁止传递头部到后端
                     # http1.0中默认值Connection: close
                     proxy_redirect                      off;
                     #proxy_pass http://10.30.30.131;
                    }
            }

    展开全文
  •  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  client_max_body_size 60m;  proxy_read_timeout 600s;  proxy_connect_timeout 30s;  }  #error_page 404 /404.html;  ...
  • proxy_set_header 设置无效解决办法

    千次阅读 2018-08-29 11:19:26
    proxy_set_header Host $host;等 但是有些时候会遇到设置了proxy_set_header参数,但是设置无效的情况,网上的资料说在nginx.conf配置文件的http配置部分增加如下配置,原因是配置项默认支持的是中划线而不是下划线...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: ...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: proxy_...
  • 先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_set_header Host $proxy_host; proxy_set_header Connection close; 上下文: http, server, location 允许重新定义或者添加...
  • 主要介绍了Nginx设置Referer来防止盗图的实现方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|less|map|eot|svg|ttf|woff|woff2|cab|scss|otf|exe|pdf|doc|xlsx)$ { # ...
  • 场景 1 很多时候,我们在做项目过程中,可能需要 用到相同的 ip,相同的... proxy_set_header Referer $http_referer;  proxy_set_header Host $host:8080;  proxy_pass http://127.0.0.1:8080/schoolSafe;  }
  • 在nginx中配置proxy_pass时,如果是按照^~匹配路径时,要注意proxy_pass后的url最后的/。当加上了/,相当于是绝对根路径,则nginx不会把location中匹配的路径部分代理走;如果没有/,则会把匹配的路径部分也给代理走。...
  • #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反向代理访问带referer的后端

    万次阅读 2016-02-24 11:15:28
    防外链大都是通过检查请求中...referer是不是可以解决问题。 用nginx搭一个反向代理 location /get/ { set $hostx “”; set $addrs “”; if ( $uri ~ “^/get/http./+([^/]+)/(.+)$”) { set $hostx $1; set $addrs
  • nginx proxy_cache缓存详解

    千次阅读 2018-12-04 20:47:00
    目录 1. 关于缓冲区指令 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 ...
  • Nginx的缓存模块proxy_cache

    千次阅读 2018-11-29 23:15:50
    Nginx缓存模块proxy_cache缓存配置语法缓存过期周期定义缓存的键,缓存的维度Nginx缓存配置示例准备web节点准备Proxy节点访问测试清理Nginx缓存方式配置某些页面不缓存,并配置缓存日志部分缓存测试 缓存配置语法 ...
  • proxy_pass指令属于ngx-http-proxy-module模块,此模块可以把请求转发到另一台服务器,在实际的反向代理工作中,会通过location功能指定的URL,然后把接收到的符合URL的请求通过proxy_pass参数抛给定义好的upstream地址...
  • Nginx 基本配置例子

    2017-12-15 16:22:24
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #==nginx跟后端服务器连接超时时间(代理连接超时) proxy_connect_timeout 60; #==连接成功后,后端服务器响应时间(代理接收超时) proxy_read_...
  • nginx模块之ngx_http_proxy_module

    千次阅读 2017-08-23 17:57:28
    nginx代理 正向代理:代理请求者的身份,访问互联网的任何服务 反向代理:代理被请求者的身份。 ngx_http_proxy_module 1.proxy_pass Syntax: proxy_pass URL; Default: ...location, if in ...1.proxy_pass后面的
  • 分享nginx做代理的一份配置

    千次阅读 2016-09-07 10:34:45
     proxy_set_header Connection $connection_upgrade; proxy_buffering off; proxy_pass http://backend;  } location / {  #proxy_set_header Host $host;  proxy_set_header X-...
  • 使用nginx的proxy_cache做网站缓存

    千次阅读 2015-08-30 19:39:34
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_...
  • nginx的proxy_cache做网站缓存

    千次阅读 2016-01-15 11:35:31
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_max_temp_file_size 0; proxy_connect_...
  • ngx_http_proxy_module 模块功能 转发请求至另一台主机 1、proxy_pass URL;... 可用位置:location, if... 注意:proxy_pass后面路径不带uri时,会将location的uri传递(附加)给后端主机 server { ... ...
  • nginx的版本./nginx -v nginx version: nginx/1.9.15 需求要求nginx缓存静态资源...配置方法针对js、css、图片文件分别增加缓存路径的指令,比如对于图片,增加如下的指令:proxy_cache_path proxy_cache_image leve...
  • Nginx动静分离+proxy_cache缓存

    千次阅读 2016-08-08 20:26:07
    nginx的动静分离和proxy_cache缓存可以同时设置,感觉在集群部署时可能效果更好。一.http模块增加缓存设置 proxy_temp_path /etc/nginx/proxy_temp; proxy_cache_path /etc/nginx/proxy_cache levels=1:2 keys_...
  • 4、反向代理(proxy_pass)与负载均衡(upstream) 5、nginx优化 1.1、基本概念 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,761
精华内容 9,104
热门标签
关键字:

proxy_set_headerreferer