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