2015-05-05 14 views
0

我试图将5G Blacklist从Apache(.htaccess)转换为Nginx(.conf)。有在.htaccess的线,是造成问题:相同的正则表达式在Apache和Nginx中表现不同

<IfModule mod_alias.c> 
    RedirectMatch 403 (\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\") 
</IfModule> 

我已经转换它的.conf如下:

代码包含在HTTP块

map $request_uri $bad_uri { 
    default 0; 
    "~*(\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")" 1; 
} 

包含代码in server block

if ($bad_uri) { 
    return 403; 
} 

据我所知,Apache和Nginx都使用perl regex,所以在从前者转换到后者时不需要做任何改变。但是,下面的URI是在Nginx的给403,但做工精细在Apache:

www.example.com/some,url,with,commas
www.example.com/?q=some,url ,用,逗号

+0

你能不能用简单的英语解释,这个正则表达式应该怎么办呢? –

+0

@AlexeyTen 5G黑名单应该阻止不好的机器人,刮板,URL扫描等。这是来自该列表的一行。从我有限的知识中,我可以看出,这个正则表达式应该匹配任何具有''''+''/,/''{0}''(/(''''''+++''|''或'\“\”' –

+0

所以,我无法理解。应该阻止或不阻止'some,url,with,commas'吗? –

回答

0

终于找到了问题。

在Apache中RedirectMatch只有网址不匹配查询字符串,而$ REQUEST_URI在nginx的地图与查询字符串的URL。

所以对于Nginx的正确的代码是:

map $uri $bad_uri { 
default 0; 
"~*(\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")" 1; 
} 
相关问题