ฉันจะกำหนดค่าบล็อกตำแหน่งที่ตั้งให้ส่งคืนไฟล์เดียวใน nginx ได้อย่างไร


12

ในแอปพลิเคชันของฉันฉันต้องการตำแหน่ง "/" เพื่อส่งคืนไฟล์ index.html แบบคงที่ฉันต้องการ "/ static" เพื่อให้บริการไฟล์คงที่จากโฟลเดอร์และฉันต้องการให้คำขออื่น ๆ ทั้งหมดส่งคืน 404 ไม่ใช่พบ ในภายหลังฉันจะเปลี่ยนเส้นทางคำขออื่น ๆ ทั้งหมดไปยังเซิร์ฟเวอร์ WSGI

นี่คือการกำหนดค่าของฉันในปัจจุบัน:

# Dev server.
server {
    listen 1337;
    charset UTF-8;

    location / {
        rewrite ^ static/index_debug.html break;
    }

    location /static {
        alias /home/tomas/projects/streamcore/static;
    }
}

โฟลเดอร์คงทำงานได้อย่างสมบูรณ์ แต่ "/" กำลังกลับมา 404 ไม่พบ ฉันได้ลองด้วย:

alias /home/tomas/projects/streamcore/static/index_debug.html;

ในบล็อกตำแหน่ง แต่จะส่งคืนข้อผิดพลาดเซิร์ฟเวอร์ภายใน 500 ข้อ ดูเหมือนว่าaliasไม่ชอบไฟล์เดียว นอกจากนี้ฉันได้ลอง:

try_files static/index_debug.html;

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

ดังนั้นคำถามของฉันคือ: ฉันจะกำหนดค่าบล็อกสถานที่ให้คืนไฟล์คงที่ได้อย่างไร


แก้ไข:ฉันเห็นจากคำตอบอื่น ๆ ที่aliasควรยอมรับไฟล์เดียวเป็นอาร์กิวเมนต์ดังนั้นฉันจึงลอง:

location = / {
    alias /home/tomas/projects/streamcore/static/index_debug.html;
}

แต่ฉันยังได้รับข้อผิดพลาดเซิร์ฟเวอร์ภายใน 500 ข้อเท่านั้น บันทึกข้อผิดพลาดสำหรับคำขอ "/" แจ้งว่า:

[การแจ้งเตือน] 28112 # 0: * 7 "/home/tomas/projects/streamcore/static/index_debug.htmlindex.html" ไม่ใช่ไดเรกทอรี

เหตุใดจึงพยายามเปิด "index_debug.htmlindex.html" ฉันไม่ได้ใช้indexคำสั่งทุกที่


คุณสามารถtry_files static/index_debug.html static/index_debug.html;
ceejayoz

@ceejayoz: ลองทำตามคำแนะนำของคุณกับlocation =/ฉันได้รับ 404 ไม่ใช่พบกับlocation /ฉันได้รับ 500 ข้อผิดพลาดภายในเซิร์ฟเวอร์
Hubro

หากฉันไม่ผิดคุณขาดคำสั่งดัชนี ... เว็บเซิร์ฟเวอร์ใด ๆ จะค้นหาไฟล์ดัชนีโดยระบุ URI รูท (/) ฉันคิดว่าคุณสามารถลบล้างสิ่งนี้ได้โดยเพิ่ม:location / { return 404; }
Martino Dino

@MartinoDino: ทำไมฉันต้องการมัน และที่ไหน?
Hubro

location = / {Index /home/tomas/projects/streamcore/static/index_debug.html;}
Martino Dino

คำตอบ:


10

เพิ่งทดสอบและใช้งานได้สำหรับฉัน:

server {
    root /tmp/root;
    server {
        listen 8080;
        location /static {
            try_files $uri =404;
        }
        location / {
            rewrite ^ /static/index_debug.html break;
        }
    }
}

ไฟล์/tmp/root/static/index_debug.htmlมีอยู่แน่นอน :)

ฉันสามารถกด URL ใดก็ได้และฉันได้รับหน้าคงที่


0

คุณสามารถใช้ try_files และเปลี่ยนเส้นทางไปยังตำแหน่งที่ระบุชื่อด้วยการเขียนใหม่ แบบนี้:

server {
    root /tmp/root;
    server {
        listen 8080;

        location / {
            try_files $uri $uri/ @index;
        }

        location @index {
            rewrite ^ static/index_debug.html break;
        }
    }
}

หากไฟล์มีอยู่ในไฟล์/tmp/rootจะให้บริการมิฉะนั้น uri จะถูกเขียนใหม่static/index_debug.htmlและจะให้บริการ

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