本文章主要介绍了Nginx proxy_set_header 配置注意事项,具有不错的的参考价值,希望对您有所帮助,如解说有误或未考虑完全的地方,请您留言指出,谢谢!

如果没有特别注意 proxy_set_header 配置,使用 proxy_set_header 可能会引起以下问题:

  1. 丢失需要的 header 信息
  2. 拿到意外的 Host 信息
  3. upstream 中的 keepalive 不能生效

官方文档

Allows redefining or appending fields to the request header passed to the proxied server. The value can contain text, variables, and their combinations. These directives are inherited from the previous level if and only if there are no proxy_set_header directives defined on the current level. By default, only two fields are redefined:
允许重新定义或附加字段到传递给代理服务器的请求头。该值可以包含文本、变量及其组合。当且仅当当前级别上没有定义 proxy_set_header 指令时,这些指令从上级继承。默认情况下,只有两个值被重新定义:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

问题的关键

在当前级别的配置中没有定义 proxy_set_header 指令时,这些指令从上级继承。
如果当前级别的配置中已经定义了 proxy_set_header 指令,在上级中定义的 proxy_set_header 指令在当前级别都会失效

举个例子:

这个配置,如果用户访问 example.com/test/index.html,后端服务拿到的 Host 值是 example.com_test,而不是期望的 example.com;后端服务器会收到 Connection: close 的 Header,而不能复用连接;后端服务器也不能从 Header 中获取到 X-Real-IP。

http { 
    ... 
    proxy_http_version 1.1; 
    proxy_set_header Host       $host; 
    proxy_set_header Connection ""; 
    proxy_set_header X-Real-IP $remote_addr; 
 
    upstream example.com_test { 
        server 127.0.0.1:8080; 
 
        keepalive 16; 
    } 
 
    server { 
        server_name  example.com; 
 
        location ^~ /test/ { 
            proxy_set_header test      test; 
            proxy_pass http://example.com_test; 
        } 
    } 
} 

注意: 在 location ^~ /test/ {...} 中真正生效的 proxy_set_header 只有这三个

proxy_set_header Host       $proxy_host; 
proxy_set_header Connection close; 
proxy_set_header test      test; 

正确的配置

http { 
    ... 
    proxy_http_version 1.1; 
    proxy_set_header Host       $host; 
    proxy_set_header Connection ""; 
    proxy_set_header X-Real-IP $remote_addr; 
 
    upstream example.com_test { 
        server 127.0.0.1:8080; 
 
        keepalive 16; 
    } 
 
    server { 
        server_name  example.com; 
 
        location ^~ /test/ { 
            proxy_set_header test      test; 
            proxy_set_header Host       $host; 
            proxy_set_header Connection ""; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_pass http://example.com_test; 
        } 
    } 
} 

参考:IT虾米网

2019年5月21日


发布评论
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Nginx学习笔记-详细讲解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。