nginx内使用正则表达式(花括号)需要注意的问题
朋友为对付一些乱七八糟网站的盗链,于是就在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/12/12$3.png;