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


42

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

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

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


私の経験では、ロケーション関数はLinuxでnginxを実行している場合にのみ正しく機能することに注意してください。Windowsで実行しているとき、これが機能しないという問題がありました
...-samsmith

回答:


43

1つのロケーションエントリでnginxの複数のディレクトリへのアクセスを制限するには

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

7
404ではなく403を返す必要があります
。– Stillmatic1985

12
これは質問にまったく答えません。

1
403を返すことは、フォルダが存在するというヒントを与える404は、すべての既存のフォルダの証拠与えていない
ドン・ウィルソン

23

「拒否」ディレクティブが一致する前に「ルート」ディレクティブが一致するためです。ディレクティブの順序を逆にすると、機能するはずです。

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

16

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の場所が一致するように選択されることです。ドキュメントからの次の注意事項は、ソリューション(上記)の基になったものです。

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


11
location /foo {
    deny all;
    return 404;
}

これにより、すべて拒否されているため、常に403が返されます。サーバーに404を返させたい場合は、次のように404のみを返します。

location /foo {
    return 404;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.