nginx内使用正则表达式(花括号)需要注意的问题

  categories:nginx  author:

来源:互联网

朋友为对付一些乱七八糟网站的盗链,于是就在nginx配置文件内写了一个正则来禁止那些域名,他写的是这个样子:
if ($http_referer ~* .*([0-9]{2,3}[a-z]{3}\.com|ffkkk\.net|444nnn\.net)) {
return   403;
}
但是用nginx -t来测试nginx配置文件语法的时候报错,提示在[0-9]这里有错。我看了看,正则写的没有问题呀,怀疑是[]的问题,我自己以前没有在ngnix内用过[],就简化了下:
if ($http_referer ~* .*[0-9]\.com) {
return   403;
}
用上面这个配置语法测试通过了。说明[]是可以直接用的,这样试过之后我恍然大悟,确定是{}的问题,因为nginx内{}是用来表示配置段的,直接用肯定有问题。但是在nginx的配置文件内,难道正则就不能用{}了吗?
肯定是可以的,要不然也太弱智了,经过google,终于找到答案:原来如果正则内有用{}的话,只要在正则的两边加上单引号或双引号就行了。
所以写成这样子就通过了:
if ($http_referer ~* "^.*[0-9]{2,3}[a-z]{3}\.com") {
return   403;
}
参考:http://www.nginxcn.com/doc/standard/httprewrite.html

注: 对花括号( { 和 } )来说, 他们既能用在重定向的正则表达式里,也是用在配置文件里分割代码块, 为了避免冲突, 正则表达式里带花括号的话,应该用双引号(或者单引号)包围。比如,要将类似以下的url

/photos/123456

重定向到:

/path/to/photos/12/1234/123456.png

可以用以下方法 (注意双引号):

rewrite "/photos/([0-9] {2})([0-9] {2})([0-9] {2})" /path/to/photos/$1/$1$2/$1$2$3.png;



快乐成长 每天进步一点点      京ICP备18032580号-1