zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    JavaEye推荐:软件开发的葵花宝典 zt
    杨建:网站加速系统架构篇
    杨建:网站加速Cache为王篇
    整理:不用ACE你不知道ACE有多烂,给饱受ACE折磨的弟兄们散分了。
    jQuery对select操作 dodo
    easyui事件和方法的调用 dodo
    .Net 下利用ICSharpCode.SharpZipLib.dll实现文件压缩、解压缩 dodo
    使用Jquery EasyUi常见问题解决方案 dodo
    如何切分用户故事 dodo
    什么是产品Backlog,什么是Sprint Backlog? dodo
  • 原文地址:https://www.cnblogs.com/zh-dream/p/12834056.html
Copyright © 2011-2022 走看看