我正在尝试使管理文件夹仅对从本地主机访问站点的用户可访问。
调用 PHP-FPM 的配置如下。我们称之为主要代码片段。
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
如果我在主代码片段后使用以下代码片段(我们称之为阻塞代码片段)
location ~ /(admin) {
allow 127.0.0.1;
deny all;
}
从 127.0.0.1 访问 /admin 文件夹的用户。从其公共 IP(例如 192.168.0.71)访问该文件夹的用户将被拒绝访问。很好(但不是那么好)。如果他们尝试访问 /admin 文件夹中的任何 PHP 文件,则会执行 PHP 代码,但不会访问其他资产(例如,/admin/index.php)
然后我移动阻塞片段,以便它位于主片段上方。
在这种情况下,如果有人尝试访问 /admin 文件夹或任何内容(甚至是 PHP 代码),他/她会收到错误 403(拒绝访问)。很好(但同样,不是那么好)。
如果有人尝试从 127.0.0.1 访问 /admin 文件夹,则授予访问权限,但不会执行 PHP 代码,因为它由位于阻止代码段下方的主代码段处理。PHP 代码不会被执行,而是被下载。
然后我想到使用以下代码片段
location ~ /(admin.*\.php) {
allow 127.0.0.1;
deny all;
}
位于主代码片段下方。但它也没有起作用(可能是因为主代码片段被执行了)
所以我的问题是:如何允许用户从 IP 127.0.0.1 访问 /admin 文件夹,并拒绝从另一个 IP 访问该文件夹及其所有内容(包括 PHP 执行)?
我的方法有什么问题?我用 Google 搜索,但没有找到解决方案。
编辑:按照Gary建议进行配置
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/html;
index index.php index.html index.htm;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$args =404;
}
location ~ /(admin\/?) {
allow 127.0.0.1;
deny all;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
location ~ \.php$ {
# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php7.0-fpm:
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;
}
}
答案1
在“阻止”代码片段中添加整个“主要”代码片段,并将其移动到原始“主要”代码片段上方。
基本上,就 nginx 而言,您有两个完全不同的位置,因此除非您在“阻止”代码片段中提出要求,否则您不会获得任何 PHP 处理。