首页 » LANMP » nginx » 正文

Nginx-Location 配置

语法规则

location [=|~|~*|^~] /uri/ { … }

= 表示精确匹配,这个优先级也是最高的
^~ 表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa 匹配到(注意是空格)。
~ 表示区分大小写的正则匹配
~* 表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则
/ 通用匹配,任何请求都会匹配到,默认匹配.
* -f 和!-f 用来判断是否存在文件
*-d 和!-d 用来判断是否存在目录
*-e 和!-e 用来判断是否存在文件或目录

优先级

下面讲讲这些语法的一些规则和优先级
多个 location 配置的情况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,不必拘泥,仅供参考):

优先级=>^~>
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

例子,有如下匹配规则:

举例

以下是各种的访问情况

访问 http://a.abc.com/,因为/是完全匹配的
如下:

=/
访问 http://a.abc.com/nginx,因为完全匹配了“=/nginx”

=/nginx
访问 http://a.abc.com/nginx,从第一个开始尝试匹配,最后匹配到了~* \.png
(注意,这是大写)
all-png
访问 http://a.abc.com/static/1111.png,虽然 static 放在最后面,但是因为有^的缘故,他是最匹配的.

Static

举个例子:我现在是在本地开发环境测试,正式服务器上有许多上传的图片,但是显然我本地存储这些图片不太合适,太占体积,但是我又需要显示它们。那我就可以做个“镜像”,把对本地 upload 目录下文件的访问重定向到服务器上,我可以这么写:

注意匹配的顺序,应该是 upload 目录匹配顺序在最前面。注意

这样是不行的,即使用了 break,仍然会走到下面的那个匹配规则。
nginx 配置下有两个指定目录的执行,root 和 alias

#若按照上述配置的话,则访问/img/目录里面的文件时,nginx 会自动去/var/www/image/目录找文件

若按照这种配置的话,则访问/img/目录下的文件时,nginx 会去/var/www/image/img/目录下找文件。

alias 是一个目录别名的定义,root 则是最上层目录的定义。还有一个重要的区别是 alias 后面必须要用“/”结束,否则会找不到文件的,而 root 则可有可无。

切记 ,nginx 的配置文件不是代码文件 ,if 也不是编程语言里的选择结构 ,而是 rewrite 模块的一个指令 。 总之,慎用 if 指令,多测试。关于这点,可看官方文档:
https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/

发表评论

正在加载验证码......

请先完成验证