nginx的location配置指令使用详解

  • 时间:2018-12-27 23:11 作者:星联科技 来源:星联科技 阅读:156
  • 扫一扫,手机访问
摘要:因为工作需要,从去年开始使用nginx做web服务器,本文是根据自己的使用经验结合各累文档汇总总结的,如有不正确之处,欢迎指教。location配置指令用来为网站的各种不同的URI集分别指定不同的配置指令。语法格式如下location [=|~|~*|^~|@] pattern { … }需要注意的

因为工作需要,从去年开始使用nginx做web服务器,本文是根据自己的使用经验结合各累文档汇总总结的,如有不正确之处,欢迎指教。

location配置指令用来为网站的各种不同的URI集分别指定不同的配置指令。语法格式如下

location [=|~|~*|^~|@] pattern { … }

需要注意的是,location配置指令有两种工作模式,即正则匹配和普通字符串匹配。只有在使用~或者~*修饰符时,指令中的pattern才可以使用正则表达式同URI进行匹配。=,^~或者没有使用修饰符这三种情况下,后面的pattern只能使用字符串常量。

我们都知道location可以在配置文件中出现N次,那么就出现了我们经常思考的一个问题,这些location指令是按什么顺序执行呢,或者者说谁具备更高的优先级呢?这对配置nginx网站是非常重要的。

当一个网站(虚拟主机,也就是一个server block)中出现多条locatioin配置指令时,nginx是按照先匹配字符串常量再匹配正则表达式的准则来扫描解释location指令。

也就是说,nginx解决location是分两个步骤

1,用“字符串比较”方法解决所有非正则表达式的location指令

2,用“正则匹配”方法解决所有带正则表达式的location指令

下面这几种情况下,会中止解决(或者解释,也就是忽略)其它的location指令。

若当前URI和带=修饰符的location中的常量表达式完全匹配,则nginx中止搜索解释其它的location指令

若当前URI和不带任何修饰符的location中的常量表达式完全匹配,则nginx中止搜索解释其它的location指令

若当前URI和带^~修饰符的location中的常量表达式匹配(注意此处不要求完全匹配),则nginx中止搜索解释其它的location指令

若当前URI和某个location中的正则表达式匹配,则nginx中止继续搜索解释其它的location指令

location就是按照这个顺序来解决location指令的。假如经过上面这几个步骤还是没有确定使用哪个location,那么nginx会从之前解决过的没有带修饰符的location指令中选择一个匹配程度最大的一个使用。要注意此时一般也就只有不带修饰符的location指令了,其它的不再起作用了。

server {

server_name www.abc.com;

root /var/www/abc.com;

location = / {

# 只有,请求http://www.abc.com/时,这个指令才起作用

#[ A ]

}

location / {

# 匹配几乎所有的请求,但是,优先级比较低,假如一个请求有其它的带正则的location匹配

# 则使用正则对应的location配置,假如没有正则,那么假如有多个不带任何修饰符的location匹配

# 当前请求,那么比较长的location指令,也就是匹配度越大的location指令优先级高

# http://www.abc.com/images/a.jpg 使用[E]location指令配置

# http://www.abc.com/images/a.png 使用[C]location指令配置,尽管它同时匹配了B,C

# http://www.abc.com/image/a.png 使用[B]location指令配置

#[ B ]

}

location /images/ {

#[ C ]

}

location ^~ /images/ {

# 匹配所有以/images/开始的请求,并中止继续搜索匹配其它的location指令

#[ D ]

}

location ~* \.(gif|jpg|jpeg)$ {

#[ E ]

}

}

详细的过程大概是这样的:

当nginx接收到一个请求,它会先搜索该主机下的所有location,而后依次检查带=修饰符,无修饰符,^~修饰符的location指令,比较URI和指令后面的字符串常量,假如带=的location指令完全匹配(注意是完全匹配),则采用并中止搜索其它的location.假如不是完全匹配,则丢弃,并检查看能否有不带修饰符的location指令,假如有,且完全匹配(注意是完全匹配),则采用并中止搜索其它的location.假如不是完全匹配,不丢弃,但是继续检查看能否有带^~修饰符的location指令,假如有,且匹配(注意是匹配),则采用并中止搜索其它的location。假如不匹配,则按顺序(指的是它们在配置文件中出现的顺序)检查所有的其它带正则表达式的location指令。假如有一个匹配,则中止继续解决其它的带正则的location指令,假如没有匹配的话,则回头看一下之前比较字符串中不带修饰符的,但是不完全匹配的location指令。

简单画了一个nginx解决location指令的流程图

nginx的location配置指令使用详解

nginx的location指令解决流程

location的指令顺序有的人看到这可能会说和顺序无关,其实在进入到正则匹配阶段,就是由顺序来决定使用哪个带正则的location指令了。

如有错误,欢迎指正,转载请注明出处。

  • 全部评论(0)
最新发布的资讯信息
【系统环境|windows】字节跳动前台面试题解析:盛最多水的容器(2021-03-20 21:27)
【系统环境|windows】DevOps敏捷60问,肯定有你想理解的问题(2021-03-20 21:27)
【系统环境|windows】字节跳动最爱考的前台面试题:JavaScript 基础(2021-03-20 21:27)
【系统环境|windows】JavaScript 的 switch 条件语句(2021-03-20 21:27)
【系统环境|windows】解决 XML 数据应用实践(2021-03-20 21:26)
【系统环境|windows】20个编写现代CSS代码的建议(2021-03-20 21:26)
【系统环境|windows】《vue 3.0探险记》- 运行报错:Error:To install them, you can run: npm install --save core-js/modules/es.arra...(2021-03-20 21:24)
【系统环境|windows】浅谈前台可视化编辑器的实现(2021-03-20 21:24)
【系统环境|windows】产品经理入门迁移学习指南(2021-03-20 21:23)
【系统环境|windows】初识webRTC(2021-03-20 21:23)
血鸟云
手机二维码手机访问领取大礼包
返回顶部