วิธี จำกัด การเข้าถึงไดเรกทอรีและส่วนย่อย


42

ฉันจำเป็นต้อง จำกัด การเข้าถึงไฟล์หรือส่วนย่อยใน direstory "testdir" ความมั่นใจของฉัน:

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

ในการกำหนดค่าของฉันฉันไม่มีข้อ จำกัด ใน / testdir / jpg_or_txt-files ทำอย่างไร?


หมายเหตุในประสบการณ์ของฉันฟังก์ชั่นที่ตั้งทำงานได้อย่างถูกต้องเฉพาะเมื่อใช้ nginx บน linux เมื่อทำงานบน Windows เรามีปัญหากับเรื่องนี้ไม่ได้ทำงาน ...
samsmith

คำตอบ:


43

เพื่อ จำกัด การเข้าถึงหลายไดเรกทอรีใน nginx ในรายการตำแหน่งเดียว

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

7
คุณควรคืนค่า 403 และไม่ใช่ 404
Stillmatic1985

12
นี่ไม่ได้ตอบคำถามเลย

1
กลับ 403 ให้คำใบ้ว่ามีโฟลเดอร์อยู่ 404 ไม่แสดงหลักฐานของโฟลเดอร์ที่มีอยู่เลย
Don Wilson

23

เป็นเพราะการจับคู่คำสั่ง "รูท" ก่อนคำสั่ง "ปฏิเสธ" สามารถจับคู่ได้ ย้อนกลับลำดับของคำสั่งของคุณและควรทำงาน:

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

16

เพื่อให้แน่ใจว่าการจับคู่ testdir ถูกเลือกแทนการจับคู่ jpg / txt ให้ใช้ตำแหน่งต่อไปนี้:

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

ในตัวอย่างของคุณคุณมีสถานที่สองประเภท location /testdirเป็นที่ตั้งคำนำหน้าเป็นมันไม่มีตัวหนอน ( ~) ระหว่างและlocation/testdir

location ~* ^.+\.(jpg|txt)$คือตำแหน่ง regex (อันที่เล็กกว่าแบบตัวพิมพ์เล็ก - ใหญ่เนื่องจากตัวอักษร*ตรงหลังตัวหนอน) จากเอกสาร nginx :

ในการค้นหาตำแหน่งที่ตรงกับคำขอที่ได้รับ nginx ก่อนตรวจสอบสถานที่ที่กำหนดโดยใช้สตริงคำนำหน้า (ตำแหน่งคำนำหน้า) ในหมู่พวกเขาสถานที่ที่มีคำนำหน้าการจับคู่ที่ยาวที่สุดจะถูกเลือกและจดจำ จากนั้นตรวจสอบนิพจน์ทั่วไปตามลำดับที่ปรากฏในไฟล์กำหนดค่า การค้นหานิพจน์ทั่วไปสิ้นสุดลงในการแข่งขันนัดแรกและใช้การกำหนดค่าที่เกี่ยวข้อง หากไม่พบการจับคู่กับนิพจน์ทั่วไปการกำหนดค่าของตำแหน่งคำนำหน้าที่จดจำไว้ก่อนหน้านี้จะถูกใช้

ปัญหาที่นี่คือที่ตั้งของ testdir ของคุณกำลังถูกจดจำ แต่จากนั้นเลือกตำแหน่ง jpg / txt ในระหว่างขั้นตอน regex ตามที่ตรงกัน หมายเหตุจากเอกสารประกอบต่อไปนี้คือสิ่งที่ฉันใช้ตามแนวทางแก้ไขปัญหาของฉัน (ที่ระบุด้านบน) เมื่อ:

หากตำแหน่งคำนำหน้าการจับคู่ที่ยาวที่สุดมีตัวปรับ“ ^ ~” การแสดงออกปกติจะไม่ถูกตรวจสอบ


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

สิ่งนี้จะทำให้คุณ 403 ตลอดเวลาเพราะปฏิเสธทั้งหมด ... เมื่อคุณต้องการให้เซิร์ฟเวอร์ให้คุณ 404 เพียงคืน 404 เท่านั้น ... เช่น:

location /foo {
    return 404;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.