本文主要是介绍Nginx——location配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1、基本语法
location [=|~|~*|^~|@] pattern {……}
其中,[=|~|~*|^~|@]被称作location modifier,这会定义Nginx如何去匹配其后的pattern,以及该pattern的最基本的属性(简单字符串或者正则表达式)
2、location modifier介绍
2.1 =
server {server_name 123.com;location = /abcd {[……]}
}
案例分析
http://123.com/abcd | 正好完全匹配 |
http://123.com/ABCD | 如果运行Nginx的系统本身对大小写不敏感的话,可以匹配 |
http://123.com/abcd?param 12 | 忽略查询串参数,这里就是/abcd后面的?param 12 |
http://123.com/abcd/ | 不匹配,因为末尾存在反斜杠,Nginx不认为这种情况是完全匹配 |
http://123.com/abcde | 不匹配 |
2.2 (None)
可以不写location modifier,Nginx仍然能去匹配pattern。这种情况下,匹配哪些以指定的pattern开头的URI,这里的URI只能是普通字符串,不能使用正则表达式。
server {server_name 123.com;location /abcd {[……]}
}
案例分析
http://123.com/abcd | 正好完全匹配 |
http://123.com/ABCD | 如果运行Nginx的系统本身对大小写不敏感的话,可以匹配 |
http://123.com/abcd?param 12 | 忽略查询串参数,这里就是/abcd后面的?param 12 |
http://123.com/abcd/ | 末尾存在反斜杠,也属于匹配范围内 |
http://123.com/abcde | 仍然匹配,因为URI是以pattern开头的 |
2.3 ~
location modifier对大小写敏感,且pattern必须是正则表达式。
server {server_name 123.com;location ~ ^/abcd$ {[……]}
}
案例分析
http://123.com/abcd | 完全匹配 |
http://123.com/ABCD | 不匹配,~对大小写是敏感的 |
http://123.com/abcd?param 12 | 忽略查询串参数,这里就是/abcd后面的?param 12 |
http://123.com/abcd/ | 不匹配,因为末尾存在反斜杠,并不匹配正则表达式^/abcd$ |
http://123.com/abcde | 不匹配正则表达式^/abcd$ |
2.4 ~*
与~类似,但这个location modifier不区分大小写,且pattern必须是正则表达式。
server {server_name 123.com;location ~* ^/abcd$ {[……]}
}
案例分析
http://123.com/abcd | 完全匹配 |
http://123.com/ABCD | 匹配,因为不区分大小写 |
http://123.com/abcd?param 12 | 忽略查询串参数,这里就是/abcd后面的?param 12 |
http://123.com/abcd/ | 不匹配,因为末尾存在反斜杠,并不匹配正则表达式^/abcd$ |
http://123.com/abcde | 不匹配正则表达式^/abcd$ |
2.5 ^~
匹配情况类似 (None) 的情况,以指定匹配模式开头的 URI 被匹配,不同的是,一旦匹配成功,那么 Nginx 就停止去寻找其他的 Location 块进行匹配了(与 Location 匹配顺序有关)。
2.6 ^~
匹配情况类似 (None) 的情况,以指定匹配模式开头的 URI 被匹配,不同的是,一旦匹配成功,那么 Nginx 就停止去寻找其他的 Location 块进行匹配了(与 Location 匹配顺序有关)。
3、location匹配顺序
1、"="前缀指令匹配,如果匹配成功,则停止其他匹配;
2、普通字符串指令匹配,顺序是从长到短,匹配成功的location如果使用^~,则停止其他匹配(正则匹配);
3、正则表达式指令匹配,按照配置文件里的顺序,成功就停止其他匹配;
4、如果第三步中有匹配成功,则使用该结果,否则使用第二步结果。
注意事项
- 匹配的顺序是先匹配普通字符串,然后再匹配正则表达式。
- 普通字符串匹配顺序是根据配置中字符长度从长到短,也就是说使用普通字符串配置的location顺序是无关紧要的,反正最后nginx会根据配置的长短来进行匹配,但是需要注意的是正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。
- 一般情况下,匹配成功了普通字符串location后还会进行正则表达式location匹配。有两种方法改变这种行为,其一就是使用“=”前缀,这时执行的是严格匹配,并且匹配成功后立即停止其他匹配,同时处理这个请求;另外一种就是使用“^~”前缀,如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。
4、匹配模式及顺序
location = /uri | =开头表示精确匹配,只有完全匹配上才能生效。 |
location ^~ /uri | ^~ 开头对URL路径进行前缀匹配,并且在正则之前。 |
location ~ pattern | ~开头表示区分大小写的正则匹配。 |
location ~* pattern | ~*开头表示不区分大小写的正则匹配。 |
location /uri | 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后。 |
location / | 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default。 |
5、实验分析
实验1
测试“^~”和“~”。在Nginx的配置文件中增加如下配置:
location ^~ /helloworld { #1return 601;
}#location /helloworld { #2
# return 602;
#}location ~ /helloworld {return 603;
}
浏览器输入http://localhost/helloworld/test,返回601。
如将#1注释,#2打开,浏览器输入http://localhost/helloworld/test,返回603。
注:#1和#2不能同时打开,如同时打开,启动nginx会报nginx: [emerg] duplicate location "/helloworld"...,因为这两个都是普通字符串。
实验 2
测试普通字符串的长短(普通字符串的匹配与顺序无关,与长短有关)
location /helloworld/test/ { #1return 601;
}location /helloworld/ { #2return 602;
}
浏览器输入http://localhost/helloworld/test/a.html,返回601。浏览器输入http://localhost/helloworld/a.html,返回602。
实验3
测试正则表达式的顺序(正则匹配与顺序相关)
location /helloworld/test/ { #1return 601;
}location ~ /helloworld { #2return 602;
}location ~ /helloworld/test { #3return 603;
}
浏览器输入http://localhost/helloworld/test/a.html,返回602;
将#2和#3调换顺序,浏览器输入http://localhost/helloworld/test/a.html,返回603
这篇关于Nginx——location配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!