nginx location匹配规则
location 匹配命令
1 2 3 4 5 6 |
~ # 波浪线执行正则匹配,区分大小写 ~* # 波浪线带星执行正则匹配,不区分大小写 ^~ # ^~ 普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其它 location 选项,一般用来匹配目录 = # 普通字符串精确匹配 空 # 普通字符串匹配,例如 location /abc {} @ # "@" 定义一个命名的 location,使用在内部重定向时,例如 error_page, try_files |
location 匹配的优先级(与 location 在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx 停止搜索其他匹配。
除了精确匹配,然后执行普通字符匹配(非正则表达式匹配),按最长匹配执行,找到最长前缀匹配的 location。举例来说,请求的路径是 /abcde,那么 location /abc {} 即使匹配还要再看配置中有没有更长的匹配,比如 location /abcd {}。找到这个最长匹配之后,如果他带有 ^~ 前缀,那么就不再继续查找。
找到最长前缀匹配后,比如找到了 location /abcd {},那么还要继续看有没有匹配的正则表达式,按正则表达式在配置文件中出现的顺序进行匹配,如果找到一个的正则表达式匹配,则nginx停止搜索其他匹配,执行该匹配 location。
当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的最长前缀匹配 location 会被使用。
简单来说 nginx 的 locatioin 按这个优先级规则:
= > ^~ > ~ = ~* >最长前缀匹配 > /
Location处理逻辑
1.用uri测试所有的prefix string;
2.Uri精确匹配到=定义的loacation,使用这个location,停止搜索;
3.匹配最长prefix string,如果这个最长prefix string带有^~修饰符,使用这个location,停止搜索,否则:
4.存储这个最长匹配;
5.然后匹配正则表达;
6.匹配到第一条正则表达式,使用这个location,停止搜索;
7.没有匹配到正则表达式,使用#4步存储的prefix string的location。
location 优先级官方文档
- Directives with the = prefix that match the query exactly. If found, searching stops.
- All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
- Regular expressions, in order of definition in the configuration file.
- If #3 yielded a match, that result is used. Else the match from #2 is used.
- =前缀的指令严格匹配这个查询。如果找到,停止搜索。
- 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
- 正则表达式,在配置文件中定义的顺序。
- 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。
例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
location = / { # 只匹配"/". [ configuration A ] } location / { # 匹配任何请求,因为所有请求都是以"/"开始 # 但是更长字符匹配或者正则表达式匹配会优先匹配 [ configuration B ] } location ^~ /images/ { # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location [ configuration C ] } location ~* .(gif|jpg|jpeg)$ { # 匹配以 gif, jpg, or jpeg结尾的请求. # 但是所有 /images/ 目录的请求将由 [Configuration C]处理. [ configuration D ] } |
请求URI例子:
- / -> 符合configuration A
- /documents/document.html -> 符合configuration B
- /images/1.gif -> 符合configuration C
- /documents/1.jpg ->符合 configuration D
@location 例子
error_page 404 = @fetch;
location @fetch(
proxy_pass http://fetch;
)
转载请保留:http://blog.redis.com.cn/115.html
@ nginx官方
https://blog.redis.com.cn/5494.html 可以参考这里
表示这里写的很是不详细啊,请问哪里有更详细的介绍?
@moming
知道了。。
http://www.ruanyifeng.com/blog/2011/03/url_hash.html
nginx location 正则是不是不能匹配#号啊? 下面写法都不行
location ~* ^/#/[^\.]+\/abc/
location ~* ^/\#/[^\.]+\/abc/
把#换成@就没问题,求助。。。
请教一个Nginx配置问题:
我的根目录下有index.php , usercp.php ,admincp.php 三个文件。
我想让
http://xxx.com/admin/xx =>这样的URL从admincp.php进入
http://xxx.com/user/xx =>这样的URL从usercp.php进入
http://xxx.com/xxx =>最后默认从index.php 进入
@leo.xie
需要转义表示图片后缀,不转义的情况下点可以匹配任何字符,例如,会匹配agif等样式的字符串
@周葛亮
这个解释的很好
location ~* .(gif|jpg|jpeg)$ 这句话,是否要修改成 location ~* \.(gif|jpg|jpeg)$
Location处理逻辑
1.用uri测试所有的prefix string;
2.Uri精确匹配到=定义的loacation,使用这个location,停止搜索;
3.匹配最长prefix string,如果这个最长prefix string带有^~修饰符,使用这个location,停止搜索,否则:
4.存储这个最长匹配;
5.然后匹配正则表达;
6.匹配到第一条正则表达式,使用这个location,停止搜索;
7.没有匹配到正则表达式,使用#4步存储的prefix string的location。
关键点在第三条的最长匹配。
server {
listen 80;
server_name m4 alias m4.fengji.com;
root /usr/shar/nginx/html;
#1
location = / {
return 500;
}
#2
location /a/1.html {
return 400;
}
#3
location ~ .html {
return 401;
}
#4
location /a/b {
return 402;
}
#5
location ^~ /a {
return 403;
}
#6
location = /a/1.html {
return 404;
}
}
http://m4/a/1.html
404
精确匹配#6
http://m4/a/2.html
403
最长匹配#5,不再匹配正则表达式
http://m4/a/b/1.html
401
最长匹配#4然后匹配#3正则表达式
http://m4/a/b/1.h
402
最长匹配#4,没有匹配的正则表达式
嘿嘿~奸笑中!
good,好东西
博主,希望你把他灭了,看着这些抄袭狗、败类就来火。
http://blog.chinaunix.net/uid-29179844-id-4761399.html
你如何知道博主不是转载别人的?
打着原创的旗号抄袭是最可耻的!
有吗 我发现我配置好的规则一但添加了wp supercache的规则后 我配的就失效了,不论是在前还是在后
能帮忙看下么~
站长,为什么我配置的nginx拦截了好多东西?
你说详细点呀
站长大神,请问location匹配首页应该怎么写啊、想做个首页301,只跳转首页其它的不动
你好,内网可以访问,外网IP访问不了,但是用firebug调试可看到nginx 1.4.0版本等信息,说明是已被nginx 监听到,报404错误,请问是不是配置的问题?如何允许内网和外网都可以访问?
写的真混乱
你可以先提高点智商再来看
问好后面的参数是匹配不到的,需要借助 $query_string去判断http://blog.redis.com.cn/142.html,这篇文章可以看看
你好,我的nginx虚拟主机的root指令下,根下程序文件是否可以包括$document_root父目录文件。
================================
比如:
指令root /data/wwwroot/web1
有以下两个程序
/data/wwwroot/web1/index.php
/data/wwwroot/a.php
问题:
index.php中是否可以包括a.php?
我觉得用相对路径应该可以吧../a.php, $document_root是针对nginx来说的,并不是针对php去如何解析
实操了一下,不行。
我目前是这样写的,可是不管用,
location ~ ^/?links.* {
deny all;
}
请帮忙。
已经回复你了,有问题可以加群找我
你好,请教一个问题,请帮忙, 我有一个需求是: http://www.a.com/?links893438934**** 后面还有很长链接, 要禁止根目录下任何以 ?links 开头的链接,非常感谢了!
看一下http://blog.redis.com.cn/142.html 应该就知道问题了
if ( $query_string ~* "links.*" ){
return 404;
}