web-dev-qa-db-ja.com

nginx:一部のサブフォルダーを除き、フォルダーへのアクセスを許可しない

フォルダーへのアクセスを拒否することはできますが、フォルダー内の一部のサブフォルダーを "deny"から除外するには

私はこのようなものを(この順序で)試しました:

#このサブフォルダーは拒否されるべきではなく、内部のphpスクリプトは実行可能でなければなりません

場所〜/ data/public {すべて許可; }

#このフォルダーには、パブリックアクセスを拒否する必要のある多くのサブフォルダーが含まれています

場所〜/ data {すべて拒否; 404を返します。 }

...これは正しく動作しません。/data/publicフォルダー内のファイルにはアクセスできます(/ data内の他のファイルはすべて拒否されます)が、PHPファイルは/ data/publicフォルダーで実行されなくなりました(これらの制限を追加しないでください、PHPファイルは実行可能です)。

なにが問題ですか?どうすれば正しいのでしょうか?それを行うにはもっと良い方法があると思います。

誰かが私にこれを手伝ってくれるとしたら、それはとても素晴らしいことです:).


ありがとうございます。ただし、PHPファイルは、/ data/public /フォルダーでは実行されません。

<? echo "test"; ?>

これは、このファイルをダウンロードとして提供します(上記の「拒否」構成なしで、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;
}

/ data /以外の他のすべてのディレクトリにあるPHPファイルが機能しています...(他のサブフォルダーも同様)。

2
carrot

Phpファイルが処理されない理由は、/data/public/の場所に到達したときに停止し、phpファイルの処理方法がわからないためです。

Php.confと呼ばれる別のファイルにphpの場所を配置して、そのファイルをサーバーブロックと/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
}

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;
}
5
Jap Mul

ロケーションルールは次のようになります。

location ^~ /data/                { deny all; }

または

location ^~ /data/public/               { allow all; }

nginxロケーションルールは次のとおりです

To find a location matching a given request, nginx first checks locations defined using the prefix strings (prefix locations). Among them, the most specific one is searched. Then regular expressions are checked, in the order of their appearance in a configuration file. A search of regular expressions terminates on the first match, and the corresponding configuration is used. If no match with a regular expression is found then a configuration of the most specific prefix location is used.

nginxアクセスルールは次のとおりです

"Access rules are checked according to the order of their declaration. The first rule that matches a particular address or set of addresses is the one that is obeyed."

したがって、動作する構成は次のようになります。

location ^~ /data/public/               { allow all; }
location ^~ /data/ { deny all; }

すべて拒否を使用すると、404ではなく403 Forbiddenが返されます。

これにより、パブリックディレクトリへのアクセスと処理、およびその他のブロックが可能になります。 Magentoのnginx構成で作業しているときにも同じ問題が発生しましたが、^〜トリックでそれを理解しました。

0
Vern Burton