编程技术分享平台

网站首页 > 技术教程 正文

nginx的location配置指令使用详解

xnh888 2024-09-25 23:46:09 技术教程 18 ℃ 0 评论

由于工作需要,从去年开始使用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指令处理流程

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

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表