详解Nginx Location配置
今天有一位同学问到Nginx的站点多路径匹配的问题?
1.www.domain.com/a需要返回/var/www/domain.com/a/index.html
2.www.domain.com/b需要返回/var/www/domain.com/b/index.html
如何配置Nginx使之生效?
解决这个问题,第一的反映是直接使用Nginx的location指令来解决,不过在给出答案之前,我们先来了解一下Nginxlocation指令的基础。
Nginx区块配置概念
在Nginx的配置文件中,通常会用两个常用的区块(Block)来进行设置:
1.Server区块
2.Localtion区块
这里的区块是指Block,你甚至可以理解为后面的那一对{}之间的配置内容。
Sever区块主要是真的主机的配置,比如配置主机的域名,IP,端口等内容。当然,在一个Nginx的配置文件里面,我们是可以指定多个Sever区块的配置的。
而Location区块则是在Sever区块里面,细分到针对不同的路径和请求而进行的配置。因为一个站点中的URI通常会非常多,所以在Location区块设置这部分,你也是可以写多个Location的配置的。
下面来看看Location配置的基本语法先:
locationoptional_modifierlocation_match{ #这个{}里面的配置内容就是一个区块Block }
上面的optional_modifier配置项是可以使用正则表达式的。常用的几种如下:
- 留空。对,留空也是一种设置方式。在留空的情况下,配置表示请求路径由location_match开始。
- =,等于号还是非常容易理解的:就是请求路径正好等于后面的location_match的值;跟第一项留空还是有区别的。
- ~,飘号(注意是英文输入的飘号)表示大小写敏感的正则匹配。
- ~*表示大小写不敏感的正则匹配。
- ^~表示这里不希望有正则匹配发生。
Nginx处理Location区块的顺序
上面了解了location指令基本的概念和常用配置。我们再来看看Location生效的顺序!这个也很重要:
每一个请求进来Nginx之后,Nginx就会选择一个Location的最佳匹配项进行响应,处理的具体流程是逐一跟location的配置进行比对,这个步骤可以分为以下几步:
先进行前缀式的匹配(也就是location的optional_modifier为空的配置)。
- Nginx其次会根据URI寻找完全匹配的location配置(也就是location的optional_modifier为=的配置).
- 如果还是没有匹配到,那就先匹配^~配置,如果找到一个配置的话,则会停止寻找过程,直接返回响应内容。
- 如果还是没有找到匹配项的话,则会先进行大小写敏感的正则匹配,然后再是大小不写敏感的正则匹配。
NginxLocation配置的一些例子:
多说无益,看了那么多理论,没有具体的例子支撑也是白搭,所以我们来看一下具体的配置例子:
location=/{ #=等号配置符,只匹配/这个路由 }
location/data{ #留空配置,会匹配有/data开始的路由,后续有匹配会往下匹配。 }
location^~/img/{ #注意^~配置,这里匹配到/img/开始的话,直接就返回了。 }
location~*.(png|gif|ico|jpg|jpeg)${ #匹配以png,gif,ico,jpgorjpeg结尾的请求;这个通常用来设置图片的请求响应。 }
非常实用的两个例子:
1.简单的图片防盗链
location~.(png|gif|jpe?g)${ valid_referersnoneblockedyourwebsite.com*.yourwebsite.com; #注意上面写上你的域名就好 if($invalid_referer){ return403; } }
2.针对一些可写入的路径,禁止php或者js的脚步执行
location~*/(media|images|cache|tmp|logs)/.*.(php|jsp|pl|py|asp|cgi|sh)${ return403; }
问题的答案
最后,我们再看问题的答案,可以是类似这个样子的:
location/a{ root/var/www/domain.com/a; } location/b{ root/var/www/domain.com/b; }