【问题标题】:Convert Apache "Is Not" rule to Nginx将 Apache “不是”规则转换为 Nginx
【发布时间】:2021-07-08 02:28:30
【问题描述】:

我有一个 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 认为if 语句在位置上下文中是“邪恶的”,并进一步指出这些 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;
}

如何才能做得更好?

【问题讨论】:

    标签: wordpress apache nginx apache2


    【解决方案1】:

    我宁愿使用两个 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 块是completely safe

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

    return ...;
    rewrite ... last;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 2019-09-13
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多