wordpress wp-login.php页面限制在nginx中的ip

Mah*_*eeb 5 nginx wordpress

我试图根据 IP 限制对 wp-login 页面的访问,使用以下代码,我能够限制对 wp-admin 的访问,但 login.php 仍然可以访问:

server {
listen 80;
root /app/;
index index.php;

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

location / {
    try_files $uri $uri/ /index.php?$args;
}

location ~ /\. {
    deny all;
}

location ~* /(?:uploads|files)/.*\.php$ {
    deny all;
}

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
}

location ~ \.php {
    include                     fastcgi_params;
    fastcgi_pass                php:9000;
    fastcgi_index               index.php;
    fastcgi_read_timeout        10s;
    fastcgi_intercept_errors    on;
    fastcgi_param               HTTP_X_FORWARDED_FOR $http_x_real_ip;
    fastcgi_param               REMOTE_ADDR $http_x_real_ip;
    fastcgi_param               SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

   location ~ ^/(wp-admin|wp-login.php) {
        allow x.x.x.x;
        allow 172.17.0.0/16;
        deny all;
   }

}
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,它与 wp-login.php 是一个普通的 php 文件有关,这可能需要特殊处理和更多配置。我还尝试采用最简单的形式,但也不起作用:

   location = wp-login.php {
    allow x.x.x.x;
    allow 172.17.0.0/16;
    deny all;
Run Code Online (Sandbox Code Playgroud)

}

nginx 日志显示以下内容:

172.17.0.1 - - [21/Aug/2017:13:00:02 +0000] "GET /wp-login.php HTTP/1.1" 200 2338 "-" "Mozilla/5.0 (Linux; Android 7.1.2; Pixel Build/NJH47F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36" "94.197.xxx.xxx,
172.17.0.5"
Run Code Online (Sandbox Code Playgroud)

我还尝试在以下阻止访问 wp-login.php 甚至从 whtilisted ip:

   location = /wp-login.php {
        allow x.x.x.x;
        allow 172.17.0.0/16;
        deny all;
   }

172.30.3.207 - - [21/Aug/2017:13:25:08 +0000] "GET /wp-login.php HTTP/1.1" 403 572 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36" "x.x.x.x, 172.17.0.3"
Run Code Online (Sandbox Code Playgroud)

如果我不断刷新几次,它将下载实际的 wp-login.php 文件。

cns*_*nst 8

您面临的潜在问题是只有一个location指令会匹配每个请求以指定请求处理的参数。此外,正如另一个答案所提到的,某些指令的顺序在 nginx 中很重要——其他一切都相等,location第一个匹配的正则表达式得到了整个蛋糕,因此,在更少的之后定义更具体的正则表达式位置是没有意义的-特定于同一级别的。

考虑到来自Drifter104 评论的启示,即完全支持嵌套位置,并且根据https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/,我们可以得出以下内容使用geo地图进行访问控制的配置:

geo $wpadmin {
    default 0;
    172.17.0.0/16 1;
}
server {
    …
    location /wp-admin {
        if ($wpadmin = 0) {
            return 403 "no wp-admin for you!\n";
        }
        try_files $uri $uri/ /index.php;
    }
    location ~ \.php$ {
        location ~ /wp-(admin/|login\.php\b) {
            if ($wpadmin = 0) {
                return 403 "no wp-admin/login for you!\n";
            }
            fastcgi_pass …
        }
        fastcgi_pass …
    }
    …
}
Run Code Online (Sandbox Code Playgroud)

但是请注意,由于只能使用单个location指令来指定如何处理请求,因此我们必须有效地将所有这些fastcgi_passet al 指令复制粘贴到两个不同的位置(例如,您可能希望将该include指令用作根据先前的建议),以及/wp-admin/对静态和动态内容实施面部控制。