将 Apache "Is Not" 规则转换为 Nginx



我有一个Apache重写规则,它可以防止Wordpress网站上的作者枚举。但是,为了在Wordpress管理中保持适当的功能,此规则不适用于URI中具有/wp-admin的任何请求。

# apache
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=d [NC]
RewriteRule ^ - [L,R=403]

什么是合适的Nginx等价物

我知道的一些事情:

  1. Nginx认为Apache的";不是";规则为";倒置逻辑";因此,不支持类似的概念
  2. Nginx不支持嵌套的if语句或多个条件if (THIS && THAT) {}
  3. Nginx对每个请求评估if语句,这对于性能来说并不理想
  4. Nginx认为CCD_ 5语句是";邪恶;在位置的上下文中,并进一步注意到这些if语句的行为可能出乎意料。因此,建议避免使用它们

这并没有给我留下太多选择。我已经设法想出了以下配置,尽管我更喜欢不会带来性能问题和/或危及稳定性的配置。

# nginx
location / {
set $MATCH "";
if ($uri !~* "^/wp-admin") { set $MATCH A; }
if ($args ~ "^author=d") { set $MATCH "${MATCH}B"; }
if ($MATCH = AB) { return 403; }
try_files $uri $uri/ /index.php?$args;
}

如何才能做得更好

我宁愿使用两个location块:

location / {
if ($arg_author ~ ^d) { return 403; }
try_files $uri $uri/ /index.php?$args;
}
location /wp-admin {
try_files $uri $uri/ /index.php?$args;
}

使用的if块是完全安全的:

如果在位置上下文中,唯一可以在内部完成的100%安全的事情是:

return ...;
rewrite ... last;

相关内容

最新更新