如果在本地主机之外访问文件夹及其所有内容,如何阻止访问?

如果在本地主机之外访问文件夹及其所有内容,如何阻止访问?

我正在尝试使管理文件夹仅对从本地主机访问站点的用户可访问。

调用 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 处理。

相关内容