Nginx的location设置教材和优先级如下:Nginx的Location可以有以下几个匹配:
1. =
2. ^~ 匹配路径的前缀,如果找到,停止搜索。
3. ~
4. ~* 为不区分大小写匹配
受到攻击discuz的缓存案例:
location ^~ /index.php {
proxy_pass http://www.ctohome.com:9192/index.php;
include vhosts/conf.proxy_cache;
}
location = / {
proxy_pass http://www.ctohome.com:9192/;
include vhosts/conf.proxy_cache;
}
location ^~ /uc_server/avatar.php {
proxy_pass http://www.ctohome.com:9192/uc_server/avatar.php;
include vhosts/conf.proxy_cache;
}
例子:
location = / {
# matches the query / only.
# 只匹配 / 查询。
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}
location ~* ".(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。
[ configuration D ]
}
如果要定义多个location,则可以有2种方式:
总之,引用Nginx的官方文档的匹配规则:
注意:正则表达式的匹配是有顺序的,按顺序匹配。其它的匹配理论上讲是只有优先级,而没有顺序的。
ningx官方新版翻译
语法: location [=|~|~*|^~|@] /uri/ { ... }
默认: 否
上下文: server
这个变量允许按照根据URI使用不同的配置.配置可以使用普通的字符串或者是正则表达式.使用正则表达式,必须使用一个前缀:
2. "~*" for case insensitive matching
1. "~" 用于区分大小写(大小写敏感)的匹配
2. "~*" 用于不区分大小写的匹配
在决定哪个location变量来匹配一个特定的查询时,普通字符串会先检查.普通字符串查找查询的开头做匹配 -- 将会使用最明确的那个匹配(我的理解是:使用匹配得最完整的那个字符串的配置).然后正则表达式按照配置文件里面的顺序来匹配.第一个匹配查询的正则表达式会停止剩下的查找.如果没有匹配的正则表达式,就会使用普通字符串的查找结果.
对于小部分系统,如Mac OS X 和Cygwin,普通字符串会以不区分大小写的情况来做匹配(0.7.7).但是,这种区别仅限于单字节 locale的 情况.
正则表达式可以包含capture(0.7.40),capture可以用在其他的指令中.
"^~" 这个前缀的作用:在常规的字符串匹配检查之后,不做正则表达式的检查---即如果最明确的那个字符串匹配的location配置中有此前缀,那么不会做正则表达式的检查.
使用 "=" 前缀可以做URI和location的精确匹配.匹配之后查询就会停止.例如,如果 "/" 这个请求常出现,使用 "location = /" 将会提高一点处理这个请求的速度.
(如何理解翻译?)
总的来说,以如下的顺序来检查指令:
1. Directives with the "=" prefix that match the query exactly. If found, searching stops.
1. 有 "=" 前缀的指令对"查询"做精确的匹配,如果找到了,查找停止.
2. All remaining directives with conventional strings. If this match used the "^~" prefix, searching stops.
2. 指令为常规字符串.如果匹配中使用了 "^~" ,查找停止.
3. Regular expressions, in the order they are defined in the configuration file.
3. 指令为正则表达式.按照配置文件里面的顺序查找.
4. If #3 yielded a match, that result is used. Otherwise, the match from #2 is used.
4. 如果#3找到了,那么就用3的.否则,就用#2的.
提醒:nginx会对编码过的URI做比较.例如,如果你想要匹配"/images/%20/test" , 你必须使用 "/images/ /test" 来定义这个location
# matches the query / only.
[ configuration A ]
}
location / {
# matches any query, since all queries begin with /, but regular
# expressions and any longer conventional blocks will be
# matched first.
[ configuration B ]
}
location ^~ /images/ {
# matches any query beginning with /images/ and halts searching,
# so regular expressions will not be checked.
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# matches any request ending in gif, jpg, or jpeg. However, all
# requests to the /images/ directory will be handled by
# Configuration C.
[ configuration D ]
}
* /documents/document.html -> configuration B
* /images/1.gif -> configuration C
* /documents/1.jpg -> configuration D
注意:上面的4段在文件中顺序可以是任意的,出来的效果都一样.虽然嵌套的location 指令是允许的,但不建议!会引起非预期的结果.