อดทนกับฉันนี่เป็นเรื่องยาว
ในตอนเริ่มต้น ฉันสร้างเซิร์ฟเวอร์ 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
แก้ไข: