cara membatasi akses ke direktori dan subdir

42

Saya perlu membatasi akses ke file atau subdirektori dalam direktori "testdir". Conf saya:

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

Dalam konfigurasi saya, saya tidak memiliki batasan pada / testdir / jpg_or_txt-file. Bagaimana cara melakukannya?


sumber
Catatan, dalam pengalaman saya, fungsi lokasi hanya berfungsi dengan baik saat menjalankan nginx di linux. Saat berjalan di windows, kami mengalami masalah dengan ini tidak berfungsi ...
samsmith

Jawaban:

43

untuk membatasi akses ke beberapa direktori di nginx dalam satu entri lokasi lakukan

...
location ~ /(dir1|dir2|dir3) {
   deny all;
   return 404;
}
...
DavidR.
sumber
7
Anda harus mengembalikan 403 dan bukan 404.
Stillmatic1985
12
Ini sama sekali tidak menjawab pertanyaan.
1
mengembalikan 403 memberi petunjuk bahwa folder itu ada, 404 tidak memberikan bukti folder yang ada sama sekali
Don Wilson
23

Itu karena arahan "root" cocok sebelum arahan "deny" dapat dicocokkan. Balikkan urutan arahan Anda dan itu akan berhasil:

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

Untuk memastikan bahwa kecocokan testdir dipilih sebagai ganti dari kecocokan jpg / txt, gunakan lokasi berikut:

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

Dalam contoh Anda, Anda memiliki dua jenis lokasi. location /testdiradalah lokasi awalan, karena tidak memiliki tilde ( ~) antara locationdan /testdir.

location ~* ^.+\.(jpg|txt)$adalah lokasi regex (yang case-insensitive, karena *langsung setelah tilde). Dari dokumentasi nginx :

Untuk menemukan lokasi yang cocok dengan permintaan yang diberikan, nginx pertama-tama memeriksa lokasi yang ditentukan menggunakan string awalan (lokasi awalan). Di antara mereka, lokasi dengan awalan pencocokan terpanjang dipilih dan diingat. Kemudian ekspresi reguler diperiksa, sesuai urutan kemunculannya di file konfigurasi. Pencarian ekspresi reguler berakhir pada kecocokan pertama, dan konfigurasi yang sesuai digunakan. Jika tidak ditemukan kecocokan dengan ekspresi reguler maka konfigurasi lokasi awalan yang diingat sebelumnya digunakan.

Masalahnya di sini, adalah bahwa lokasi testdir Anda diingat, tetapi kemudian lokasi jpg / txt dipilih selama tahap regex, karena cocok. Catatan berikut dari dokumentasi adalah yang menjadi dasar solusi saya (diberikan di atas):

Jika lokasi awalan pencocokan terpanjang memiliki pengubah "^ ~" maka ekspresi reguler tidak dicentang.

Pasang kembali Monica 2331977
sumber
11
location /foo {
    deny all;
    return 404;
}

Ini akan memberi Anda 403 sepanjang waktu karena tolak semua ... Ketika Anda ingin server memberi Anda 404, cukup kembalikan 404 saja ... seperti:

location /foo {
    return 404;
}
RemyNL
sumber