• nginx proxy_set_header设置,自定义header


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

         

      在第一台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部分的值是上一台nginxip地址,

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

         

  • 相关阅读:
    android之Fragment(官网资料翻译)
    Java获取当前时间的年月日方法
    Android Fragment Base
    Java JNI初探
    PHP 初学之登录查询小case
    PHP 初学
    tomcat:run和tomcat7:run的区别,以及Apache Tomcat Maven Plugin 相关
    Intellij IDEA:maven的本地仓库问题
    Java 构造方法的执行过程(猜测)
    PHP wamp server问题
  • 原文地址:https://www.cnblogs.com/liuxia912/p/10943970.html
Copyright © 2020-2023  润新知