• Nginx中$http_host、$host、$proxy_host的区别


    变量 是否显示端口 值是否存在
    host

    "Host:value"显示

    值为a:b的时候,只显示a

    http_host "Host:value",value存在就显示
    proxy_host

    默认80不显示

    其他端口显示

    "Host:value"显示

    通过Nginx配置演示:

    [root@ans3 conf]# cat nginx.conf
    
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
    
        sendfile        on;
        tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    #     upstream backend {
    #       server 10.0.0.50:8080;
    #}
    
        server {
              listen       80;
              server_name  a.test.com;
    
        location / {
            proxy_pass http://10.0.0.50:8080;
            proxy_set_header X-Proxy-Host $proxy_host;
            proxy_set_header Host $http_host;
               index index.html index.htm;
           }
    }
    }

    另一台服务器配置

    [root@master conf]# cat nginx.conf
    
    #user  nobody;
    worker_processes  1;
    
    #error_log  logs/error.log;
    #error_log  logs/error.log  notice;
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;
    
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       8080;
            server_name  www.test.com aa.test.com;
    
    
            location / {
          return 200 'http_host=[$http_host] host=[$host] proxy_host=[$http_x_proxy_host]
    ';
    }
    }
    }

    不携带请求头 Host

    [root@ans3 conf]# curl -H 'Host:' --http1.0 http://a.test.com
    http_host=[] host=[www.test.com] proxy_host=[10.0.0.50:8080]
     
    变量说明
    http_host   请求无 Host, 则 http_host 为空, 继而无 Host 传到 proxy
    host www.test.com proxy 无 Host 传入, 则使用其 server_name 的第一项
    proxy_host
    10.0.0.50:8080
    取自于 proxy_pass 的参数

    携带请求头 Host

    [root@ans3 conf]# curl -H 'Host:abc:123' --http1.0 http://a.test.com
    http_host=[abc:123] host=[abc] proxy_host=[10.0.0.50:8080]
    变量说明
    http_host abc:123 给啥拿啥
    host abc 第一个:前的内容(小写)
    proxy_host
    10.0.0.50:8080
    带端口显示

    修改真实服务器的端口为默认端口

    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  logs/access.log  main;
    
        sendfile        on;
        tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    #     upstream backend {
    #       server 10.0.0.50:8080;
    #}
    
        server {
              listen       80;
              server_name  a.test.com;
            
        location / {
            proxy_pass http://10.0.0.50:80;
            proxy_set_header X-Proxy-Host $proxy_host;
            proxy_set_header Host $http_host;
               index index.html index.htm;
           }
    }
    }
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main;
    
        sendfile        on;
        #tcp_nopush     on;
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;
    
        server {
            listen       80;
            server_name www.test.com aa.test.com;
    
    
            location / {
          return 200 'http_host=[$http_host] host=[$host] proxy_host=[$http_x_proxy_host]
    ';
    }
    }
    }

    访问时proxy_host会省略80端口

    [root@ans3 conf]# curl -H 'Host:abc:123' --http1.0 http://a.test.com
    http_host=[abc:123] host=[abc] proxy_host=[10.0.0.50]
  • 相关阅读:
    用学习逃避成长,听新知缓解焦虑
    谈谈“人”和“技能”
    SpringMVC的工作原理
    Spring MVC 处理静态资源文件
    nrpe的安装设置
    Maatkit工具使用<一>之mysql主从数据校验工具
    phpcgi占用cpu100%的一次排障之旅
    nginx支持cgi
    如何查看服务器RAID卡信息的SHELL脚本和命令介绍
    Mysql的一次经典故障
  • 原文地址:https://www.cnblogs.com/zh-dream/p/12834056.html
Copyright © 2020-2023  润新知