Score:0

Nginx try_files ล้มเหลวในพารามิเตอร์แรกและส่งคืน 404

ธง jp

อดทนกับฉันนี่เป็นเรื่องยาว

ในตอนเริ่มต้น ฉันสร้างเซิร์ฟเวอร์ Nginx เพื่อเซิร์ฟเวอร์ไฟล์แบบสแตติกสำหรับบริษัทของฉัน และมันใช้งานได้ดีกับ config snippet ต่อไปนี้สำหรับการให้บริการไฟล์:

เซิร์ฟเวอร์ {
  # ของ ssl มากมาย
  รูท /path/to/files;

  ที่ตั้ง / {
    รวม cors_support;
    ส่งไฟล์บน;
    sendfile_max_chunk 1m;

    try_files $uri =404;
  }

เรียบง่าย สะอาดตา และใช้งานได้จริง จนกระทั่งฉันคิดว่าฉันจะเพิ่มฟังก์ชันอื่นให้กับเซิร์ฟเวอร์นี้: จัดเก็บแอปพลิเคชันของเราที่สร้างขึ้นและให้บริการแก่ทีม QA ของเรา เนื่องจากไฟล์แอปพลิเคชันอาจมีขนาดค่อนข้างใหญ่ ฉันจึงเพิ่มวอลุ่มพื้นที่เก็บข้อมูลอีกอันสำหรับบิวด์เท่านั้น และคิดว่าฉันสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วยการเปลี่ยนแปลงง่ายๆ ในการกำหนดค่า Nginx ดังต่อไปนี้ (แสดงเฉพาะส่วนที่เกี่ยวข้อง):

เซิร์ฟเวอร์ {
  #ส่วนใหญ่เหมือนกัน
  รูท /new/path/to/builds;

  ที่ตั้ง / {
    #เหมือน แต่ก่อน
    try_files $uri @cdn_files;
  }

  ตำแหน่ง @cdn_files {
    #การตั้งค่าคอร์และ send_file บางส่วน
    รูท /path/to/files;
    try_files $uri =404;
  }
}

สิ่งที่ฉันคาดว่าจะเกิดขึ้นตามเอกสาร:

  • คำขอเข้ามาสำหรับไฟล์
  • ตรวจสอบบล็อกแรกของไฟล์
  • พบไฟล์? ใช่=ส่งไฟล์ ไม่=เปลี่ยนเส้นทางไปยังตำแหน่งที่ตั้งชื่อ
  • ชื่อตำแหน่ง -> พบไฟล์? ใช่=ส่งไฟล์ no=404 หน้า

เกิดอะไรขึ้นจริง:

  • คำขอเข้ามาสำหรับไฟล์
  • ตรวจสอบบล็อกแรกของไฟล์
  • พบไฟล์? ใช่=ส่งไฟล์ no=404 หน้า

ฉันได้ลองพยายามหลายครั้งเพื่อแก้ไขปัญหานี้ รวมถึงความพยายาม "ทักทายแมรี่" ที่เสียสติ

สิ่งนี้ให้ผลลัพธ์เดียวกัน (หน้า 404):

# ... รหัสที่ไม่เกี่ยวข้อง
ราก /;
ที่ตั้ง / {
  # ... รหัสที่ไม่เกี่ยวข้องเพิ่มเติม
  try_files /new/path/to/builds/$uri /path/to/files/$uri =404;
}

สิ่งนี้ให้ผลลัพธ์เดียวกัน (หน้า 404):

# ...
รูท /new/path/to/builds;

ที่ตั้ง / {
  # ...
  try_files $uri @cdn_files;
}

ตำแหน่ง @cdn_files {
  # ...
  รูท /path/to/files;
  try_files $uri =403; #โปรดทราบว่าหน้าที่ส่งมาคือ 404 ไม่ใช่ 403
}

สิ่งนี้สร้าง 404 เช่นกัน:

# ฉันลบคำสั่ง "รูท" ออกจากบล็อกเซิร์ฟเวอร์สำหรับการทดสอบนี้

ที่ตั้ง / {
  # ...
  รูท /new/path/to/builds;
  try_files $uri ../realitve/path/to/files/$uri =404;
}

สิ่งอื่น ๆ ที่ควรทราบ:

  • บันทึกข้อผิดพลาดแสดงเพียง 1 ความพยายามในการค้นหาไฟล์ที่พารามิเตอร์แรกของ try_files คำสั่ง
  • หากไฟล์มีอยู่ในพารามิเตอร์ตัวแรกของไฟล์ try_files คำสั่งให้ส่งไฟล์
  • ฉันไม่คิดว่ามันสัมพันธ์กัน แต่ในกรณี: OS คือ Ubuntu 16.04

แก้ไข:

  • Nginx เวอร์ชัน 1.21.0
Ivan Shatsky avatar
gr flag
ฉันคิดว่าคุณเข้าใจว่าไฟล์จะถูกค้นหาที่ `root` + `uri` นั่นคือ URI คำขอ `/uploads/myfile` จะถูกค้นหาเป็น `/new/path/to/builds/uploads/myfile` ก่อน และ `/path/to/files/uploads/myfile` วินาที นอกจากนั้น ไม่มีข้อผิดพลาดในการกำหนดค่าของคุณ เหตุผลเดียวที่ฉันเดาได้ก็คือคำขอของคุณได้รับการจัดการโดยสถานที่อื่นที่ไม่ใช่ `สถานที่ / { ... }` อย่างไรก็ตาม เพื่อให้แน่ใจว่าการกำหนดค่าทั้งหมดจำเป็น รวมถึง URI คำขอจริง
Score:0
ธง jp

ดังนั้นในที่สุดฉันจึงจัดการให้สิ่งนี้ทำงานได้โดยกำหนดเส้นทางคำขอขาเข้าสำหรับบิลด์ผ่าน URL ใหม่และเข้าสู่บล็อกเซิร์ฟเวอร์ของตัวเอง ปล่อยให้การเข้าถึงไฟล์ดั้งเดิมเหมือนเดิมก่อนที่จะมีการแก้ไข และตอนนี้ URL ทั้งสองก็ทำงานเพื่อดึงไฟล์จากเฉพาะของพวกเขา สถานที่

ฉันค้นหา googled และ fiddled เป็นเวลาหลายชั่วโมง แต่ฉันไม่สามารถแก้ไขการเข้าถึงไฟล์จากหลายไดเร็กทอรีในบล็อกเซิร์ฟเวอร์เดียว แม้ว่าจากการดูเอกสารประกอบแล้ว มันควรจะเป็นไปได้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา