nginx host和default_server

结论:

1 URL和Host的区别: URL负责找到服务器,到服务器上时解析靠server_name匹配Host

2 浏览器上的host默认会自动从URL上解析(例如URL: tom.com/login host会设置成tom.com)

3 nginx上host匹配不到server会走default_server处理请求

 

nginx配置 例如:

upstream xizhang{
    server 127.0.0.1:8080;
}
server {
    listen 80 ;
    root /var/www/html;
    server_name tom.com;
    
location  / {
     proxy_pass http://xizhang;
    }
}

比如我的主机IP是1.1.1.1 , 域名为 tom.com

浏览器默认访问 1.1.1.1 和 tom.com 都是能请求成功(如果没有设置Host,浏览器默认会把URL解析出Host,例如访问http://1.1.1.1/login ,host会自动设置成1.1.1.1

我们可以单独设置Host

nginx host和default_server_第1张图片

此时Host没有匹配到任何server,就会走default_server,仍然能请求成功

Host:

server_name 匹配Host

 

 

default_server:

http {
    # 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server  
    server {
        listen 80;
        server_name www.a.com;
        ...
    }
    
    server {
        listen 80 default_server;
        server_name www.b.com;
        ...
    }
}

如果没有显示设置default_server,那么默认会将第一个server设置为default_server。

default_server : 当请求的Host没有匹配到任何server_name时,这个默认的server会处理这个请求。

 

禁止通过IP访问(浏览器会自动设置host=ip,通过IP访问但Host=域名可以正常访问):

http {
    server {
        listen 80;
        server_name tom.com;
        ...
    }
   
    
    # 直接指定 ip server_name
    server {
        listen 80;
        server_name 1.1.1.1;
        return 403; # 403 forbidden
    }
    
}

 

此时浏览器访问tom.com是可以的,但是访问1.1.1.1会直接返回403

nginx host和default_server_第2张图片

通过IP访问,但Host设为域名还是可以请求成功:

nginx host和default_server_第3张图片

 

 

 

 

 

 

如果想禁止 Host为其它任何域名 的请求

http {
    server {
        listen 80;
        server_name tom.com;
        ...
    }
    

    server {
        listen 80 default_server;
        server_name _; # _ 并不是重点 __ 也可以 ___也可以
        return 403; # 403 forbidden
    }
}

对于URL是正确的,但Host是错误的(比如host=www.baidu.com)访问,直接返回403

nginx host和default_server_第4张图片

 

 

 

 

 

 

 

 

你可能感兴趣的:(nginx)