web-dev-qa-db-ja.com

ディレクトリとサブディレクトリへのアクセスを制限する方法

ディレクトリ「testdir」内のファイルまたはサブディレクトリへのアクセスを制限する必要があります。私のconf:

...
location ~* ^.+\.(jpg|txt)$ {
            root   /var/www/site;
        }
location /testdir {
        deny all;
        return 404;
        }
...

私の構成では、/ testdir/jpg_or_txt-filesに制限はありません。どうやってするの?

42
tst

1つの場所のエントリでnginxの複数のディレクトリへのアクセスを制限するには

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...
43
DavidR.

これは、「root」ディレクティブが「deny」ディレクティブが一致する前に一致するためです。ディレクティブの順序を逆にすると、機能するはずです。

...
location /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
...
22

Jpg/txtの一致ではなくtestdirの一致が選択されていることを確認するには、次の場所を使用します。

_location ^~ /testdir {
  deny all;
  return 404;
}
location ~* ^.+\.(jpg|txt)$ {
  root   /var/www/site;
}
_

あなたの例では、2種類の場所があります。 _location /testdir_は、locationと_~_の間にチルダ(_/testdir_)がないため、プレフィックスの場所です。

location ~* ^.+\.(jpg|txt)$は正規表現の場所です(チルドの直後の_*_のため、大文字と小文字は区別されません)。 nginxドキュメント から:

特定のリクエストに一致する場所を見つけるために、nginxは最初にプレフィックス文字列を使用して定義された場所(プレフィックスの場所)をチェックします。その中で、一致するプレフィックスが最も長い場所が選択され、記憶されます。次に、構成ファイルでの出現順に正規表現がチェックされます。正規表現の検索は最初の一致で終了し、対応する構成が使用されます。正規表現との一致が見つからない場合は、以前に記憶されたプレフィックスの場所の構成が使用されます。

ここでの問題は、testdirの場所が記憶されているにもかかわらず、正規表現の段階でjpg/txtの場所が一致するように選択されていることです。ドキュメントからの次のメモは、私のソリューション(上記)のベースとなったものです。

最長の一致するプレフィックスの場所に「^〜」修飾子がある場合、正規表現はチェックされません。

location /foo {
    deny all;
    return 404;
}

これは、すべてを拒否するため、常に403を提供します...サーバーが404を提供するようにしたい場合は、次のように404を返すだけです。

location /foo {
    return 404;
}
12
RemyNL