同样的正则表达式在Apache和Nginx中表现不同

时间:2015-05-05 04:26:37

标签: regex apache .htaccess nginx

我试图将5G Blacklist从Apache(.htaccess)转换为Nginx(.conf)。 .htaccess中有一行导致问题:

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

我已将其转换为.conf,如下所示:

http块中包含的代码

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

服务器块中包含的代码

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,with,commas

1 个答案:

答案 0 :(得分:0)

终于找到了问题。

在Apache RedirectMatch 中仅匹配没有查询字符串的网址,而nginx中的 $ request_uri 会映射到包含查询字符串的网址。

所以Nginx的正确代码是:

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