朋友为对付一些乱七八糟网站的盗链,于是就在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;