我试图根据 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 文件。
您面临的潜在问题是只有一个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/对静态和动态内容实施面部控制。
| 归档时间: |
|
| 查看次数: |
10126 次 |
| 最近记录: |