Nginx正则表达式之匹配操做符详解

Nginx正则表达式之匹配操做符详解

nginx能够在配置文件中对某些内置变量进行判断,从而实现某些功能。例如:防止rewrite、盗链、对静态资源设置缓存以及浏览器限制等等。因为nginx配置中有if指令,可是没有对应else指令,因此判断要分为匹配和不匹配。html

字符串表达式支持正则表达式,能设定大小写是否敏感。所以共有四个操做符,java

以下:nginx

~     区分大小写(大小写敏感)匹配成功 
~*   不区分大小写匹配成功 
!~    区分大小写匹配失败 
!~*  不区分大小写匹配失败正则表达式


1: 限制某些类型的客户端的访问
if指令
全部的Nginx内置变量均可以经过if指令和正则表达式来进行匹配,而且根据匹配结果进行一些操
 浏览器

 代码以下 复制代码

location / {
if ($http_user_agent ~ MSIE) {
return 503;
}
}缓存

#限制IE访问spa

若是把MSIE改为 Mozilla 就基本上把IE和firefox这样pc浏览器限制了
2和3主要是针对盗链作处理
2:针对不一样的文件类型.net

可能这个指令是咱们平时使用正则匹配用的最多的指令:firefox

 代码以下 复制代码


location ~ .*.(wma|wmv|asf|mp3|mmf|zip|rar|jpg|gif|png|swf|flv)$ {
     if ($http_referer ~* javagg.com) {
     #rewrite ^/ http://www.javagg.com/403.html;
     return 403;
      }
}htm

3:针对不一样的目录

 代码以下 复制代码

location /img/ {
    root /data/img/;
   if ($http_referer ~* javagg.com) {
             rewrite  ^/  http://www.admin99.net/images/error.gif
             #return   403;
    }
}

1.^~ 标识符后面跟一个字符串。

Nginx将在这个字符串匹配后中止进行正则表达式的匹配(location指令中正则表达式的匹配的结果优先使用),如:location ^~ /images/,你但愿对/images/这个目录进行一些特别的操做,如增长expires头,防盗链等,可是你又想把除了这个目录的图片外的全部图片只进行增长expires头的操做,这个操做可能会用到另一个location,例如:location ~* .(gif|jpg|jpeg)$,这样,若是有请求/images/1.jpg,nginx如何决定去进行哪一个location中的操做呢?结果取决于标识符^~,若是你这样写:location /images/,这样nginx会将1.jpg匹配到location ~* .(gif|jpg|jpeg)$这个location中,这并非你须要的结果,而增长了^~这个标识符后,它在匹配了/images/这个字符串后就中止搜索其它带正则的location。

2.= 表示精确的查找地址,

如location = /它只会匹配uri为/的请求,若是请求为/index.html,将查找另外的location,而不会匹配这个,固然能够写两个location,location = /和location /,这样/index.html将匹配到后者,若是你的站点对/的请求量较大,可使用这个方法来加快请求的响应速度。


3.@ 表示为一个location进行命名,即自定义一个location,这个location不能被外界所访问,只能用于Nginx产生的子请求,主要为error_page和try_files。
注意,这3个标识符后面不能跟正则表达式,虽然配置文件检查会经过,并且没有任何警告,可是他们并不会进行匹配。
综上所述,location指令对于后面值的匹配顺序为:

1.标识符“=”的location会最早进行匹配,若是请求uri匹配这个location,将对请求使用这个location的配置。 2.进行字符串匹配,若是匹配到的location有^~这个标识符,匹配中止返回这个location的配置。 3.按照配置文件中定义的顺序进行正则表达式匹配。最先匹配的location将返回里面的配置。 4.若是正则表达式可以匹配到请求的uri,将使用这个正则对应的location,若是没有,则使用第二条匹配的结果。

相关文章
相关标签/搜索