Location
语法规则
语法规则: location [=|~ |~ *|^~] /uri/ { … }
-
= 开头表示精确匹配
-
^~ 匹配任何已 /images/ 开头的任何查询并且停止搜索。这个符号我理解成了^非和~正则,就是不用正则。
-
~ 开头表示区分大小写的正则匹配
-
~* 开头表示不区分大小写的正则匹配
-
!~和 !~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
-
/ 通用匹配,任何请求都会匹配到,一般作为最后的匹配。
匹配步骤
- 匹配普通location
- 如果没有使用=,则匹配不是严格匹配,而是前缀匹配,总是选取最长的匹配路径
- 不管有没有命中,都匹配正则location(如果使用了^~,则不匹配正则location,=也可以)
- 如果正则location命中,选用正则location
- 否则,使用普通location
“^~ ” 和 “=” 都能阻止继续搜索正则 location,区别是什么?
共同点是它们都能阻止继续搜索正则 location
不同点是 “^~ ” 依然遵守 “最大前缀” 匹配规则,然而 “=” 不是 “最大前缀”,而是严格匹配
index
在nginx的location块中,可以增加index来配置初始页
server {
listen 80;
server_name example.org www.example.org;
location / {
root /data/www;
index index.html index.php;
}
location ~ \.php$ {
root /data/www/test;
}
}
index的原理如下:
如果文件存在,则使用文件作为路径,发起内部重定向。直观上看上去就像再一次从客户端发起请求,Nginx再一次搜索location一样。
既然是内部重定向,域名+端口不发生变化,所以只会在同一个server下搜索。
那么上面的例子中,如果你使用example.org或www.example.org直接发起请求,那么首先会访问到“/”的location,结合root与index指令,会先判断/data/www/index.html是否存在,如果不,则接着查看
/data/www/index.php ,如果存在,则使用/index.php发起内部重定向,就像从客户端再一次发起请求一样,Nginx会再一次搜索location,毫无疑问匹配到第二个~ .php$,从而访问到/data/www/test/index.php。
root和alias
root和alias都可以表示本地路径,要区别在于nginx如何解释location后面的uri,这会使两者分别以不同的方式将请求映射到服务器文件上。
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径
alias是一个目录别名的定义,root则是最上层目录的定义。
还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。。。而root则可有可无~~
有时修改nginx配置文件,nginx -s reload重启后不起作用,经排查是启动了多个nginx,kill后启动就好了。
网友评论