前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Nginx正则表达式之匹配操作符详解 原

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

作者头像
拓荒者
发布2019-03-11 10:29:31
1.3K0
发布2019-03-11 10:29:31
举报
文章被收录于专栏:运维经验分享运维经验分享

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

字符串表达式支持正则表达式,能设定大小写是否敏感。因此共有四个操作符,

如下:

~     区分大小写(大小写敏感)匹配成功  ~*   不区分大小写匹配成功  !~    区分大小写匹配失败  !~*  不区分大小写匹配失败

1: 限制某些类型的客户端的访问 if指令 所有的Nginx内置变量都可以通过if指令和正则表达式来进行匹配,并且根据匹配结果进行一些操

代码如下

复制代码

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

#限制IE访问

如果把MSIE改成 Mozilla 就基本上把IE和firefox这样pc浏览器限制了 2和3主要是针对盗链做处理 2:针对不同的文件类型

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

代码如下

复制代码

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;       } }

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,如果没有,则使用第二条匹配的结果。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/11/23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档