我有一个Apache重写规则,它可以防止Wordpress网站上的作者枚举。但是,为了在Wordpress管理中保持适当的功能,此规则不适用于URI中具有/wp-admin
的任何请求。
# apache
RewriteCond %{REQUEST_URI} !^/wp-admin [NC]
RewriteCond %{QUERY_STRING} author=d [NC]
RewriteRule ^ - [L,R=403]
什么是合适的Nginx等价物
我知道的一些事情:
- Nginx认为Apache的";不是";规则为";倒置逻辑";因此,不支持类似的概念
- Nginx不支持嵌套的
if
语句或多个条件if (THIS && THAT) {}
- Nginx对每个请求评估
if
语句,这对于性能来说并不理想 - 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;