Nginx的路径匹配符号:
= 表示精准匹配
^~ 表示url以某个常规字符串开头,大多数情况下用来匹配url路径,nginx不对请求做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)
~ 表示正则匹配,区分大小写
~* 表示正则匹配,不区分大小写
!~ 表示区分大小写不匹配的正则
!~* 表示不区分大小写不匹配的正则
/ 任何请求都会匹配
匹配优先级
首先匹配=, 其次匹配^~ , 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。
例子:
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到规则C
访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
简单通用配置
静态动态分离,除了静态资源以外的请求都交给Tomcat处理.
示例1:
location / {
proxy_pass http://localhost:8080
}
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
root /webroot/res/;
}
示例2:
location ~* .(gif|jpg|jpeg)$ {
rewrite .(gif|jpg|jpeg)$ /logo.png;
}
#不区分大小写匹配任何以gif,jpg,jpeg结尾的请求,并将请求重定向到/logo.png
示例3:
location ~^.+\.txt$ {
root /usr/local/nginx/html;
}
区分大小写匹配以.txt结尾的请求,并设置此location的路径为/usr/local/nginx/html/.也就是以.txt几位的请求将访问/usr/local/nginx/html/路径下的txt文件
二 alias与root的区别
root 实际访问路径会拼接url中的路径
alias 实际访问的路径不会拼接url中的路径
示例
location ^~ /meradmin/ {
alias /usr/loca/nginx/sitewww/;
}
请求: http://meradmin.langwenke.com/meradmin/index.html
实际访问:/usr/local/nginx/sitewww/index.html
location ^~ /meradmin/ {
root /usr/loca/nginx/sitewww/;
}
请求:http://meradmin.langwenke.com/meradmin/index.html
实际访问:/usr/local/nginx/sitewww/meradmin/index.html
nginx 中配置根据文件类型下载
location ~* .*.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|csv) {
add_header Content-Type "application/octet-stream";
if ( $args ~ ^filename=(.*) ) {
add_header Content-Disposition "attachment; filename=$1";
}
root 项目路径;
}
location ~* (\.txt)$ {
location ~ robots\.txt$ {
allow all;
}
deny all;
}
三 last和break关键字的区别
1.last和break当出现在location之外时,两者的作用是一致的没有任何差异
2.last和break当出现在内部时:
last : 使用了last指令,rewrite后会跳出location作用域,重新开始再走一次刚才的行为
break: 使用了break指令,rewrite后不会跳出location作用域,它的生命也在这个location中终结
四 permanent和redirect 关键字的区别
rewrite ..... permanent 永久性重定向,请求日志中的状态吗为301
rewrite.......redirect 临时重定向,请求日志中的状态吗为302
五,综合示例
比如:我们需要将符合“/test/(\d+)/[\w-\.]+” 这个正则表达式的URL重定向到一个固定的页面。符合这个正则表达式的页面可能是:http://test.com/test/12345/abc122.html、http://test.com/test/456/11111cccc.js等
从上面的介绍可以看出,这里可以使用rewrite重定向或者alias关键字来达到我们的目的。因此,这里可以这样做:
(1)使用rewrite关键字:
location ~ ^.+\.txt$ {
root /usr/local/nginx/html/;
}
location ~* ^/test/(\d+)/[\w-\.]+$ {
rewrite ^/test/(\d+)/[\w-\.]+$ /testpage.txt last;
}
这里将所有符合条件的URL(PS:不区分大小写)都重定向到/testpage.txt请求,也就是 /usr/local/nginx/html/testpage.txt 文件
2.使用alias关键字
location ~* ^/test/(\d+)/[\w-\.]+$ {
alias /usr/local/nginx/html/static/sta1.html;
}
这里将所有符合条件的URL(PS:不区分大小写)都重定向到/usr/local/nginx/html/static/sta1.html 文件