Nginx路由详解
2019-05-27 本文已影响0人
南风nanfeng
本文总结Nginx的location配置策略。结合案例说明location的用法。
location配置语法:location [=|~|~*|^~] /uri/ { … }
1、 =。精确匹配查血前缀,如果找到路径,则停止向下匹配。
2、 ~。使用正则表达式匹配,该符号表示大小写敏感。
3、 ~*。使用正则表达式匹配,表示大小写不敏感。
4、 ^~。匹配常规字符串,表示以该字符串开头的路径。
相对应的四个经典案例介绍
location = / {
#精确匹配,只匹配/查询
}
location / {
#匹配任何查询,所有请求都是以/开头。但是正则表达式规则和长的块规则将被优先匹配和查询;
}
location ^~ /images/ {
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
}
location ~* \.(gif|jpg|png)${
#匹配任何以gif、jpg、png结尾的请求。然后所有/images/目录的请求将使用第三个
}
例子请求:
/ -> configuration A
/documents/document.html -> configuration B
/images/1.gif -> configuration C
/documents/1.jpg -> configuration D
下面是详细的八个案例:
location = / {
#精确匹配,/后面不能加任何字符串,符合此条件就直接返回数据,不再像下匹配。
if (-d $request_filename) {
root /usr/local/nginx/html/; #当用户访问newweb的时候,则显示此目录的内容,除此之外访问其他的任何目录都不匹配。
[动作A]
}
location / {
#因为所有的地址都以/开头,所以这条规则将匹配到所有请求,但是非精确匹配会采取正则和最长字符串会优先匹配,因此还会向下继续匹配,比如当访问/bbs的时候,还需要看下面是否更精确的匹配。
[ 动作B]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 如果后面的正则表达式都没有匹配到,就匹配这一条
[动作C]
}
location ^~ /images/ {
# 匹配任何以/images/ 开头的任何请求并且停止搜索,后面任何正则表达式将不会被测试。
[动作D]
}
location ~* \.(gif|jpg|jpeg)$ {
#~* 为不区分大小写
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求/images/下的图片会被动作D匹配处理,因为动作D有^~会优先匹配并终止匹配,所以到达不了这一条正则
[动作E]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在,如果动作D存在,则这一条就不生效。
[动作F]
}
location /images/abc {
#最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在,如果D存在,则这一条就不生效。
#F与G的放置顺序是没有关系的
[动作G]
}
location ~ /images/abc/ {
# 动作D存在,这一条不生效,如果注销动作D,则会优先最长匹配 动作G 开头的地址,然后向下匹配,到这一条的时候就会匹配并生效。
[ configuration H ]
}
匹配优先级,顺序 no优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
上面的匹配结果
按照上面的location写法,以下的匹配示例成立:
/ -> config A
精确完全匹配,即使/index.html也匹配不了
/downloads/download.html -> config B
匹配B以后,往下没有任何匹配,采用B
/images/1.gif -> configuration D
匹配到F,往下匹配到D,停止往下
/images/abc/def -> config D
最长匹配到G,往下匹配D,停止往下
你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序
/documents/document.html -> config C
匹配到C,往下没有任何匹配,采用C
/documents/1.jpg -> configuration E
匹配到C,往下正则匹配到E
/documents/Abc.jpg -> config CC
最长匹配到C,往下正则顺序匹配到CC,不会往下到E