我试图将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
答案 0 :(得分:0)
终于找到了问题。
在Apache RedirectMatch 中仅匹配没有查询字符串的网址,而nginx中的 $ request_uri 会映射到包含查询字符串的网址。
所以Nginx的正确代码是:
map $uri $bad_uri {
default 0;
"~*(\,|\)\+|/\,/|\{0\}|\(/\(|\.\.\.|\+\+\+|\||\\\"\\\")" 1;
}