测试Nginx中location的优先级!
Posted cxm123123form
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了测试Nginx中location的优先级!相关的知识,希望对你有一定的参考价值。
location [=|~|~*|^~] /uri/ … = 开头表示精确匹配 ~ 开头表示区分大小写的正则匹配 ~* 开头表示不区分大小写的正则匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,
可以被规则^~ /static/ /aa匹配到(注意是空格)。 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹配到。 多个location配置的情况下匹配顺序为: 首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
======================================================================================
前提安装好Nginx后主配置文件如下:(压缩和延时可忽略)
user nginx nginx; worker_processes 2; error_log logs/error.log info; pid logs/nginx.pid; events use epoll; worker_connections 10240; http include mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] "$request" ‘ ‘$status $body_bytes_sent "$http_referer" ‘ ‘"$http_user_agent" "$http_x_forwarded_for"‘; access_log logs/access.log main; sendfile on; server_tokens off; keepalive_timeout 65; client_header_timeout 60; client_body_timeout 60; gzip on; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain text/javascript application/x-javascrip t text/css text/xml application/xml application/xml+rss; server listen 80; server_name www.source.com; charset uft-8; access_log logs/source.com.access.log main;
测试区
location /
return 400;
location ^~ /test/
return 402;
location /test
return 401;
location ^~ /test/aaa/
return 403;
location = /test/aaa
return 404;
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html
root html;
每次修改完主配置文件都必须执行如下两条命令:
[root@localhost ~]# nginx -t
[root@localhost ~]# killall -HUP nginx //重启nginx
测试理论:故意把低优先级的location放前面,看是否是因为linux的从上而下匹配导致匹配紊乱
第一次测试:多个通配的优先级测试,加入location /test
[root@localhost conf]# curl -v 127.0.0.1:80/test
< HTTP/1.1 401 Unauthorized
测试结果:/test(完整路径)的优先级高于location /(通配)
第二次测试:location正则的优先级测试,我们加入^~/test/,使用正则匹配以test开头的
[root@localhost ~]# curl -v 127.0.0.1:80/test/
< HTTP/1.1 402 Payment Required
测试结果:~^/test的优先级高与/test,也就是说正则location优先级大于完整路径大于通配(前提是完整的正则路径否则返回值为401的完整路径)
[root@localhost ~]# curl -v 127.0.0.1:80/test
< HTTP/1.1 401 Payment Required
测试结果:/test的优先级高与^~/test,也就是说完整路径大于正则
********
第三次测试:多个正则的优先级测试,我们使用两个正则,主要是来验证下,是不是正则配置得越多,优先级就越高。
[root@localhost ~]# curl -v 127.0.0.1:80/test/aaa
< HTTP/1.1 402 Payment Required
测试结果:结果返回402,也就是匹配到第一个正则后,底下的正则不会再去匹配。由于请求/test/aaa/,命中^/test,所以底下的正则就无效了
第四次测试:我们加入精准匹配,也就是nginx的=,我们来测试下精准匹配的优先级
[root@localhost ~]# curl -v 127.0.0.1:80/test/aaa
< HTTP/1.1 404 Not Found
测试结果:返回404。这个说明了,精准匹配=的优先级是最高的,不管它放到哪里。
总结论:精确匹配 > 完整路径 > 正则 > 通配
以上是关于测试Nginx中location的优先级!的主要内容,如果未能解决你的问题,请参考以下文章