精华内容
下载资源
问答
  • 关于nginx中proxy_set_header的设置

    万次阅读 多人点赞 2018-09-05 16:53:40
    版权声明:本文为博主原创文章,未经博主允许不得转载。... 参考资料: 1 proxy_set_header设置Host为$proxy_host,$host与$local_host的区别_a19860903的专栏-CSDN博客 2 《精通Nginx》— 第4章 Nginx作为反向代理

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    昨天一个开发找我帮忙配置一个nginx的转发,本来很容易的配置,但是坑了我好久才解决。。。需求大致是:

    nginx上配有aaa.example.com的虚拟主机,现在需要将访问http://aaa.example.com/api/x.x/client/的请求转到http://bbb.example.com/api/x.x/client/,bbb.example.com的虚拟主机在另外一台nginx上,其中x.x表示位数不定的版本号,如:1.0或1.20.345都可能。请求转过去要求url保持不变

    用rewrite转发的话,url会发生变化的,那就用proxy_pass吧,于是添加了如下的配置:

    location ~ ^/api/([0-9]+)(\.[0-9]+)*/client/ {
        proxy_pass http://bbb.example.com;
    } 

    在现有环境的nginx里添加这段配置之后,访问却始终转不过去,查看nginx日志也只能看到是404信息,并没有更多定位问题的信息。检查了许久也没找到原因,于是重新装了一台新nginx,里面只加上面这段配置,结果nginx是能够转发成功的,这说明单独来看这条location的配置是没有问题的,很有可能是现有环境nginx里的某些配置影响到了这个转发。 
    为了定位问题原因,我将aaa.example.com虚拟主机下的其他配置注意注释掉来调试,最后发现当注释掉proxy_set_header Host $http_host ;这条配置之后,就能成功转发了。这才注意到是反向代理配置的问题。现有环境中原有的配置也不能随便删掉,上网查了下原因,找到下面这种解决方案:

    location ~ ^/api/([0-9]+)(\.[0-9]+)*/client/ {
        proxy_pass http://bbb.example.com;
        proxy_set_header Host $proxy_host;
    } 

    即,在location里面添加一条proxy_set_header Host $proxy_host;配置。

    Host设置为$http_host时,则不改变请求头的值,所以当要转发到bbb.example.com的时候,请求头还是aaa.example.com的Host信息,就会有问题;当Host设置为$proxy_host时,则会重新设置请求头为bbb.example.com的Host信息。

    另外,关于proxy_pass转发url的参数,可以通过在location中用rewrite来做,所以完善后的配置如下:

    location ~ ^/api/([0-9]+)(\.[0-9]+)*/client/ {
        rewrite /(.*)$ /$1 break;
        proxy_pass http://bbb.example.com;
        proxy_set_header Host $proxy_host;
    } 

    在location用rewrite改变了URI之后,proxy_pass将使用改变后的URI。上面例子(.*)是将所有参数传给$1,转发时/$1会拼接在http://bbb.example.com后面。

    补习

    自己之前并没有太留意nginx中proxy_set_header的设置,借这次遇到的问题,补习下功课。

    proxy_set_header用来重定义发往后端服务器的请求头。

    语法格式: 
    proxy_set_header Field Value;

    Value值可以是包含文本、变量或者它们的组合。常见的设置如: 
    proxy_set_header Host $proxy_host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $remote_addr;

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

    参考资料: 
    proxy_set_header设置Host为$proxy_host,$host与$local_host的区别_a19860903的专栏-CSDN博客 
    2 《精通Nginx》— 第4章 Nginx作为反向代理

    展开全文
  • Nginx指令add_headerproxy_set_header的区别

    万次阅读 多人点赞 2019-07-09 17:33:37
    如何理解反向代理? Nginx是反向代理服务器,我们可以从下面的图来理解为什么是反向代理。以Nginx为中心,数据的流向是从Server到Nginx再到Client,注意我...proxy_set_header和add_header的区别 区别:proxy_set...

    如何理解反向代理?
    Nginx是反向代理服务器,我们可以从下面的图来理解为什么是反向代理。以Nginx为中心,数据的流向是从ServerNginx再到Client,注意我说的是数据(响应数据),而不是请求。我们都知道水流一定是从上游流到下游,所以给Server一个别称上游服务器,当然这个别称并不是我定义的。
    在这里插入图片描述

    proxy_set_headeradd_header的区别

    区别:proxy_set_headerNginx设置请求头信息给上游服务器,add_headerNginx设置响应头信息给浏览器。

    • proxy_set_header

      假如Nginx请求上游服务器时,添加额外的请求头,就需要使用proxy_set_header。在Java中使用HttpServletRequest#getHeader(String name)来获取请求头的值,name是请求头的名称。
      例如:proxy_set_header X-Request-URI $scheme://$host/$uri;

      String requestUrl = request.getHeader("X-Request-URI");
      if (requestUrl == null) {
          // 从Servlet服务器获取客户端请求地址
          requestUrl = request.getRequestURL().toString();
      }
      
    • add_header
      Nginx响应数据时,要告诉浏览器一些头信息,就要使用add_header。例如跨域访问(详细参见Nginx跨域访问配置

      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
      add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'
      # 由于跨域请求,浏览器会先发送一个OPTIONS的预检请求,我们可以缓存第一次的预检请求的失效时间
      if ($request_method = 'OPTIONS') {
      	add_header 'Access-Control-Max-Age' 2592000;
      	add_header 'Content-Type' 'text/plain; charset=utf-8';
      	add_header 'Content-Length' 0;
      	return 204;
      }
      
    展开全文
  • 一、proxy_set_header和add_header的区别 proxy_set_header是nginx设置请求头给上游服务器,add_header是nginx设置响应头信息给浏览器。 1.1 proxy_set_header 语法格式: proxy_set_header field value; ...

    一、proxy_set_headeradd_header的区别

    proxy_set_headernginx设置请求头给上游服务器,add_headernginx设置响应头信息给浏览器。

    1.1 proxy_set_header

    语法格式:
    proxy_set_header field value;
    value值可以是包含文本、变量或者它们的组合。
    常见的设置如:
    proxy_set_header Host $proxy_host;
    proxy_set_header version 1.0;
    

     假如nginx请求上游服务器时,添加额外的请求头,就需要使用proxy_set_header。在java中使用HttpServletRequest.getHeader(String name)来获取请求头的值,name是请求头的名称。

    例如: proxy_set_header version 1.0;

    String version = request.getHeader("version");
    System.out.println(version);

     

    1.2 add_header

    nginx响应数据时,要告诉浏览器一些头信息,就要使用add_header。例如跨域访问

    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'
    # 由于跨域请求,浏览器会先发送一个OPTIONS的预检请求,我们可以缓存第一次的预检请求的失效时间
    if ($request_method = 'OPTIONS') {
    	add_header 'Access-Control-Max-Age' 2592000;
    	add_header 'Content-Type' 'text/plain; charset=utf-8';
    	add_header 'Content-Length' 0;
    	return 204;
    }
    

    更改完毕后,进入nginx sbin目录执行./nginx -s reload重启nginx

    参考一

    参考二

    参考三

    展开全文
  • 先来看下proxy_set_header的语法 语法: proxy_set_headerfieldvalue; 默认值: proxy_set_header Host $proxy_host; proxy_set_header Connection close; 上下文: http,server,location ...

    先来看下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;

     

    场景 nginx 转发端口 路由器二次转发了,端口不一样 (shiro 或者其他一些权限控制架构会自动跳转,导致的端口不对。)

     proxy_set_header Host $host:$proxy_port;  

    这个$proxy_port 写死 

     

    如果某个请求头的值为空,那么这个请求头将不会传送给后端服务器:

    proxy_set_header Accept-Encoding "";
    展开全文
  • 场景:在用Nginx做反向代理的时候,加入...经过老大的解决后加了一行proxy_set_header Host $proxy_host就成功转发了,具体代码如下: location ~ ^/api/([0-9]+)(\.[0-9]+)*/application/ { proxy_pass http://...
  • 文章目录场景参考文档用法 场景 nginx负载均衡 参考文档 nginx.org proxy_set_header 用法 ...Syntax: proxy_set_header ...proxy_set_header Host $proxy_host; proxy_set_header Connection close; Context: htt...
  • nginx反向代理中的proxy_set_header

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

    千次阅读 2019-05-15 21:56:20
    转自:... 先来看下proxy_set_header的语法 语法: proxy_set_headerfieldvalue; 默认值: proxy_set_header Host $proxy_host; proxy_set_header Conne...
  • 1.nginx 配置模板 server { listen 80; ... client_max_body_size 512M;... proxy_set_header Connection ""; proxy_http_version 1.1; proxy_connect_timeout 300; proxy_read_timeout ...
  • nginx中proxy_set_header Host $host的作用

    万次阅读 2020-10-30 18:54:03
    nginx配置upstream负载均衡后请求400,配置proxy_set_header Host $host成功.请问这是什么原理?proxy_set_header Host $host有什么作用? upstream配置: 路由配置: 起初没有配置proxy_set_header Host $host等参数...
  • 在使用Nginx做反向代理的时候,proxy_set_header功能可以设置反向代理后的http header中...Nginx的官网文档中说下面这两条是做反代时默认的,所以$proxy_host 自然是 proxy_pass后面跟着的host了 proxy_set_header Hos
  • 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允许重新定义或者添加发往后端服务器的请求...
  • proxy_set_header设置Host为$proxy_host,$host与$local_host的区别 转载 2015年11月18日 22:29:28 9689 先来看下proxy_set_header的语法 语法: proxy_set_header field value; 默认值: proxy_...
  • 1.首选说明设置proxy_set_header的作用 允许重新定义或者添加发往后端服务器的请求头 2$host 和$http_host 和$proxy_host的说明 $proxy_host 自然是 proxy_pass后面跟着的host 比如一个请求 ...
  • 但是,proxy_set_header设置为7010端口,所有的请求都到了10.0.0.100:8080这台应用,就无法起到负载均衡的作用. 问题来了,要实现如下功能,应如何配置呢. 1,用户必须统一入口(10.0.0.0.102). 2,请求必须经过10.32.4...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: ...
  • Nginx proxy_set_header:即允许重新定义或添加字段传递给代理服务器的请求头。该值可以包含文本、变量和它们的组合。在没有定义proxy_set_header时会继承之前定义的值。默认情况下,只有两个字段被重定义: proxy_...
  • 如果设置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_...
  • nginx中proxy_set_header 的作用

    千次阅读 2018-02-09 23:02:51
    其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。 Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而...
  • proxy_set_header 设置无效解决办法

    千次阅读 2018-08-29 11:19:26
    proxy_set_header Host $host;等 但是有些时候会遇到设置了proxy_set_header参数,但是设置无效的情况,网上的资料说在nginx.conf配置文件的http配置部分增加如下配置,原因是配置项默认支持的是中划线而不是下划线...
  • proxy_set_header 其他项等 总结 三、扩展 ->脚本 proxy_set_header $host $proxy_host $http_host 各个变量含义 python 获取请求所有数据信息脚本 本文会先由一个问题引入,然后再进行多种情况进行分析。 ...
  • 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 配置了反向代理后,接口访问一直400 proxy_pass http://imglib.xxx.xxxx.com;...proxy_set_header Host $host这一行的作用是把原http请求的Header中的Host字段也放到转发的请求里。 如果不加这一行的话,nginx...
  • nginx proxy_set_header Host $http_host 配置

    千次阅读 2018-02-06 18:56:00
    其中proxy_set_header指令就是该模块需要读取的配置文件。在这里,所有设置的值的含义和http请求同中的含义完全相同,除了Host外还有X-Forward-For。Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而...
  • 这里是如果没设置这个头,在Nignx反向代理后,Java web那边获取的...proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 通过这种这种方式,将客户端源ID地址设置到X-Real-IP中。 完整设置如下: ...
  • 设置了proxy_set_header host 访问的是server_name 域名,域名指它的IP就是 proxy_pass的地址,所以通常设置proxy_set_header host 1.22 nginx反向代理-proxy_pass 示例2: http://192.168.1.10/aming/a.html...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 93,602
精华内容 37,440
关键字:

proxy_set_header