nginx location 一些尝试

1. 匹配到目录,会再一次转发进行location匹配

 server {
        listen       80;
        server_name  192.168.3.112;

        #规则1
        location = / {
         root   html1;
         index  index.htm;
         expires 40s;
        }

        规则2
        location  / {
         root   html1;
        index  index.html index.htm;
         expires 30s;
        }
    }

如上面的配置,如果访问 192.168.3.112 因为访问的 / 是目录,第一次会普通匹配两个规则(规则1和规则2)因为根据最大前缀和精确匹配,最终第一次匹配的结果是规则1

因为是目录,会进行第二次匹配,第二次匹配是 /index.htm (根据规则1中index的配置),这时进行普通匹配(规则1和规则2)最终只匹配到规则2,所以当访问 192.168.3.112时最终返给客户端的是 规则2 通过expires 可以看到是30s

2.多个host匹配,先匹配精确,然后匹配*开头的,然后匹配*结尾的,最后匹配正则表达式,最后是localhost或者空 当同时到匹配多个host,如果一个访问在前面host匹配不到,会尝试匹配后面的host的location,但是expires无效。。。(可能是bug),所以尽量在自己需要的host里面配置完整的规则

       listen       80;
        server_name  192.168.3.112;
        
        #规则1
        location = / {
         root   html1;
         index  index.html;
         expires 40s;
        }

        #规则2
        location  / {
         root   html1;
        index  index.html index.htm;
         expires 30s;
        }
    }
    server {
        listen       80;
        server_name  localhost;
        #规则3
        location =/ {
            root   html;
           expires 20s;
        }
        #规则4
        location / {
            root   html;
            index  index.html index.htm;
            expires 10s;
        }

和上面的那个类似,当访问 192.168.3.112 时会匹配到规则2,如果把规则2屏蔽掉,那么会匹配到规则4,通过抓包可以看到并没有设置缓存过期时间

3. 如果访问 192.168.3.112/abc 回是什么情况呢?看下面的匹配规则


    server {
        listen       80;
        server_name  192.168.3.112;

        #规则1
        location = /abc {
            root   html;
            index  index.html index.htm;
            expires 60s;
        }
        
        #规则2
        location  / {
         root   html1;
         index  index.html index.htm;
         expires 30s;
        }
    }

首先匹配到规则1,然后nginx会返回客户端301,location跳转到 192.168.3.112/abc/ 然后客户端再发起http请求,这次会匹配到规则2,也就是非标准文件或者目录形式的访问,nginx会直接当作目录处理,然后返回301

通过上面3个例子可以看出设置的缓存等等都是最终匹配到的的location决定的,下面来测试一台nginx反向代理到另一台(192.168.3.110)的情况,配置如下:

 upstream httpserver {
        server 192.168.3.112:80; #这里匹配到 192.168.3.112 机器的192.168.3.112那个host
       #server test.com:80;   #这里匹配到对应机器上的test.com那个host

    }
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://httpserver;
            root   html;
            index  index.html index.htm;
            expires 100s;
        }

当访问各种情况时和上面的3中结果匹配是一样的,但是最终的缓存时间设置等是由本机的location配置决定的,通过抓包可以看到基于192.168.3.110的各种访问,缓存都是100s

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值