nginx:禁止访问文件夹,某些子文件夹除外

car*_*rot 2 php rewrite nginx rules

如何拒绝对文件夹的访问,但“拒绝”中的某些子文件夹除外?

我尝试了这样的事情(按此顺序):

#这个子文件夹不应该被拒绝,里面的php脚本应该是可执行的

位置 ~ /data/public { 允许所有; }

#此文件夹包含许多应拒绝公共访问的子文件夹

位置 ~ /data { 全部拒绝;返回404;}

...这不能正常工作。/data/public 文件夹中的文件是可以访问的(/data 中的所有其他文件都应该被拒绝),但 PHP 文件不再在 /data/public 文件夹中执行(如果我不添加这些限制,PHP文件是可执行的)。

怎么了?怎么可能是正确的?我认为有更好的方法来做到这一点。

如果有人能帮我解决这个问题,那就太好了:)。


谢谢,但 PHP 文件仍然没有在 /data/public/ 文件夹中执行,就像一个简单的

<? echo "test"; ?>
Run Code Online (Sandbox Code Playgroud)

它为您提供此文件作为下载(没有上面的“拒绝”配置,php 文件运行良好)。

我的PHP配置:

location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)

/data/ 之外的所有其他目录中的 PHP 文件都在工作......(其他子文件夹也是如此)。

Jap*_*Mul 5

php 文件没有被处理的原因是当它到达该/data/public/位置时它会停在那里并且不知道如何处理 php 文件。

尝试将您的 php 位置放在另一个名为 php.conf 的文件中,并将该文件包含在您的服务器块和/data/public/块中。所以你的配置看起来像

server {
    location ^~ /data/public/ {
        allow all;
        try_files $uri $uri/ /index.php?args;
        # include to avoid writing it twice..
        include php.conf
    }

    location ^~ /data/ { 
        deny all; 
    }

    # .....
    # Some other config blocks
    # .....

    # Put this line instead of the php config block to avoid writing the php part twice
    include php.conf
}
Run Code Online (Sandbox Code Playgroud)

并且php.conf文件看起来(在您的情况下)如下所示:

location ~ \.php$ {
     fastcgi_split_path_info ^(.+\.php)(/.+)$;
     fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
     fastcgi_index index.php;
     include fastcgi_params;
}
Run Code Online (Sandbox Code Playgroud)