ฉันกำลังกำหนดค่าการจัดการ nginx ของหน้าข้อผิดพลาดบางอย่างและไฟล์สื่อ "เริ่มต้น" อื่น ๆ (เช่น favicon.ico และ robots.txt) ในขณะนี้และฉันพบปัญหาเล็กน้อยเพื่อให้สิ่งต่าง ๆ ทำงานตามที่ฉันต้องการสำหรับหน้าข้อผิดพลาดบางอย่าง .
โดยทั่วไปสิ่งที่ฉันพยายามทำคือให้บริการไฟล์บางอย่างสำหรับเซิร์ฟเวอร์ภายใต้รูทสำหรับเซิร์ฟเวอร์นั้นเช่น /var/www/someserver.com/robots.txt หากไฟล์นั้นไม่มีอยู่ฉันต้องการให้ nginx ไปที่ "default" เช่น /var/www/default/robots.txt นี่เป็นส่วนสำคัญพื้นฐานของวิธีการตั้งค่า (สำเร็จ):
server {
...
root /var/www/someserver.com;
location ~* ^/(robots\.txt)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
มันใช้งานได้ดีมาก
ฉันพยายามทำเช่นเดียวกันสำหรับหน้าข้อผิดพลาดและฉันไม่สามารถทำสิ่งนั้นได้แม้ว่า:
server {
...
root /var/www/someserver.com;
error_page 404 /404.html;
location ~* ^/(404\.html)$ {
error_page 404 = @default;
}
location @default {
root /var/www/default;
}
}
โปรดทราบว่า "ใช้งานได้" ในแง่ที่ว่าหากคุณเข้าชม someserver.com/404.html อันดับแรกจะพยายามโหลด /var/www/someserver.com/404.html ก่อนจากนั้นถอยกลับไปที่ / var / www / default /404.html หากไม่พบ อย่างไรก็ตามหากคุณเข้าชม someserver.com/blahblah จะแสดงเฉพาะหน้า 404 หากตั้งไว้ที่ /var/www/someserver.com/ มันจะไม่ถอยกลับไปยังไดเรกทอรีเริ่มต้นหากไฟล์นั้นไม่มีอยู่
อย่างไรก็ตามคุณสามารถสิ่งที่ฉันพยายามที่จะบรรลุ (นั่นคือเหตุผลที่ฉันรวมตัวอย่างการทำงานแรก)
ความคิดใด ๆ
แก้ไข:
จากคำตอบของ Martin F นี่คือสิ่งที่ฉันลงเอยด้วยกัน:
# Doesn't work when error page is returned on a POST request
server {
...
root /var/www/someserver.com;
error_page 404 = @notfound;
error_page 500 502 504 = @server_error;
error_page 503 = @maintenance;
location @notfound {
try_files /404.html /../default/404.html =404;
}
location @server_error {
try_files /500.html /../default/500.html =500;
}
location @maintenance {
try_files /503.html /../default/503.html =503;
}
}
มันใช้งานได้ดี บล็อกที่เกิดขึ้นจริงของ error_pages และตำแหน่งด้านบนนั้นอยู่ในไฟล์ server_defaults.conf ที่รวมอยู่กับโฮสต์เสมือนทุกตัวซึ่งเป็นสาเหตุที่ฉันไม่ได้ใส่รหัสเส้นทางในแต่ละตำแหน่งและใช้เส้นทางสัมพัทธ์เป็นค่าเริ่มต้น
แก้ไข 2:
วิธีนี้มีปัญหา หากคุณโพสต์ไปที่ URL ที่ส่งคืนข้อผิดพลาดเมธอดคำขอ POST จะถูกส่งไปพร้อมกับความพยายาม try_files (สำหรับฉัน) นี้ทำให้เกิดข้อผิดพลาด 405 Not Allowed เนื่องจาก nginx พยายามโพสต์เป็นหลักเช่น /default/500.html แทนที่จะเพิ่งได้รับหน้านั้น
แก้ไข 3:
ฉันโพสต์โซลูชันที่ใช้งานได้ใกล้เคียงกับแนวคิดดั้งเดิมของฉันมาก