Score:1

Nginx try_files ไม่ทำงานภายในบล็อกเซิร์ฟเวอร์

ธง ar
http {
รวม mime.types;
แอปพลิเคชัน default_type/octet-stream;

เซิร์ฟเวอร์ {
    รูท / เว็บไซต์;
    ฟัง 80;
    server_name localhost;

    #ไม่ทำงาน
    try_files /logo.png /logo.jpg /ข้อผิดพลาด;

    #ได้ผล
    เขียนใหม่ ^/e /ข้อผิดพลาด;

    #ได้ผล
    # return 200 "$request_uri จัดการโดยเซิร์ฟเวอร์บล็อก";

    ที่ตั้ง / {
        default_type ข้อความ/ธรรมดา;
        กลับ 200 "จับคู่คำนำหน้าราก";
    }

    ตำแหน่ง / ข้อผิดพลาด {
        default_type ข้อความ/ธรรมดา;
        กลับ 404 "ไม่พบโลโก้";
    }
}

ฉันต้องการทราบว่าอะไรคือสาเหตุของการประเมินนี้ ฉันไม่พบคำอธิบายที่เชื่อถือได้ทั้งในเอกสารหรือในฟอรัม

โดยวิธีที่ฉันได้ทดลองสถานการณ์ต่อไปนี้:

  • ลบตำแหน่ง / {} บล็อกและทำงานได้ตามที่ตั้งใจไว้ ฉันรู้แล้ว เมื่อส่งคำขอไปยังเซิร์ฟเวอร์ ระบบจะทำการประเมินเซิร์ฟเวอร์ก่อน บล็อกแล้วบล็อกตำแหน่งที่ตรงกัน แต่ดูเหมือนว่า try_files คำสั่งถูกละเว้น (ทำไม?!!) ถ้าฉันแก้ไขอาร์กิวเมนต์สุดท้ายของ try_files คำสั่งเขียน URI ใหม่ดังนั้นควรทำงานเหมือนเขียนใหม่ คำสั่ง ทั้งคำสั่งการเขียนซ้ำและการส่งคืนทำงานได้ตามที่ตั้งใจไว้ พวกเขาประเมินทุกครั้งไม่ว่าจะมีสถานที่หรือไม่ บล็อกการแข่งขันหรือไม่

ฉันค้นคว้ามากมายเพื่อหาข้อมูลที่เชื่อถือได้ซึ่งอธิบายสถานการณ์นี้ แต่ไม่พบ ดังนั้นฉันจึงขอคำตอบหรือแหล่งที่มาเกี่ยวกับ Nginx จากคนที่รู้

Richard Smith avatar
jp flag
สมมติฐานของคุณที่ว่า "ได้รับการประเมินครั้งแรกโดยการบล็อกเซิร์ฟเวอร์" นั้นไม่ถูกต้อง
Safar Safarli avatar
ar flag
@ริชาร์ด สมิธ ขอบคุณสำหรับความสนใจ. คุณช่วยอธิบายได้ไหมว่าทำไม
Ivan Shatsky avatar
gr flag
@SafarSafarli นอกจากสิ่งที่ Richard Smith พูดไปแล้ว คุณควรรู้ว่ามีขั้นตอนการประมวลผลคำขอที่แตกต่างกัน ตรวจสอบ [เอกสารการพัฒนา nginx](http://nginx.org/en/docs/dev/development_guide.html#http_phases) หรือ [บทความนี้](http://www.nginxguts.com/phases/) สำหรับข้อมูลเพิ่มเติม คำสั่งจาก `ngx_http_rewrite_module' ที่ระดับเซิร์ฟเวอร์ถูกประมวลผลระหว่าง `NGX_HTTP_SERVER_REWRITE_PHASE` ในขณะที่คำสั่ง `try_files` ประมวลผลระหว่าง `NGX_HTTP_PRECONTENT_PHASE`
Safar Safarli avatar
ar flag
@IvanShatsky ขอบคุณสำหรับความสนใจของคุณ
Safar Safarli avatar
ar flag
@IvanShatsky ฉันได้อ่านส่วนของบทความที่คุณให้ไว้แต่ฉันพบว่ามันค่อนข้างยากที่จะเข้าใจ เช่น: " `ngx_http_try_files_module` และ `ngx_http_mirror_module` ลงทะเบียนตัวจัดการที่เฟสนี้.." การเรียก `ngx_http_try_files_module` เป็นโมดูลทำให้เกิดความสับสน ไม่ควรใช้คำ "คำสั่ง" แทนหรือ
Ivan Shatsky avatar
gr flag
@SafarSafarli คำสั่ง `try_files` จริง ๆ แล้วอยู่ใน [`ngx_http_try_files_module`](https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_try_files_module.c) แทนที่จะเป็น [`ngx_http_core_module` ](https://github.com/nginx/nginx/blob/master/src/http/ngx_http_core_module.c) (ดูลิงก์ GitHub ที่ให้ไปยังซอร์สโค้ด nginx)
Safar Safarli avatar
ar flag
@IvanShatsky แล้วเหตุใดจึงวางเป็นคำสั่งของโมดูลหลักhttps://nginx.org/en/docs/http/ngx_http_core_module.html มันสับสนมาก
Ivan Shatsky avatar
gr flag
@SafarSafarli ฉันพบคำตอบสำหรับคำถามของคุณ มัน _เป็น_คำสั่งของโมดูลหลักจนกระทั่งมีการออกแบบใหม่ในปี 2560 จนกระทั่งคำสั่ง `try_files` นั้นใช้ `TRY_FILES_PHASE` พิเศษที่มีให้เฉพาะสำหรับ `try_files` และไม่มีคำสั่งอื่นใด ด้วยการออกแบบใหม่ `PRECONTENT_PHASE` ถูกเพิ่มไปยังเวิร์กโฟลว์การประมวลผลคำขอ nginx และการใช้งานคำสั่ง `try_files` ถูกย้ายไปยังโมดูลแยกต่างหากโดยใช้เฟสนั้น ตอนนี้โมดูลของบุคคลที่สามสามารถใช้ `PRECONTENT_PHASE` ใหม่นี้พร้อมกับ `nginx_http_try_files_module`
Ivan Shatsky avatar
gr flag
@SafarSafarli ดังนั้นฉันคิดว่าทีม nginx เพิ่งตัดสินใจที่จะไม่เขียนเอกสารใหม่ มีความแตกต่างเล็กน้อยจากมุมมองของผู้ใช้ปลายทาง เช่นเดียวกัน คุณไม่สามารถปิดใช้งานทั้ง `nginx_http_core_module` หรือ `nginx_http_try_files_module` เมื่อคุณสร้าง nginx จากแหล่งที่มา คุณสามารถดูการออกแบบใหม่ดังกล่าวที่กระทำกับแหล่ง nginx [ที่นี่](https://github.com/nginx/nginx/commit/129b06dc5dfab7b4513a4f274b3778cd9b8a6a22)
Score:0
ธง jp

ดู nginx ประมวลผลคำขออย่างไร. แต่ฉันจะเพิ่มคำเตือนสองสามข้อที่ตอบคำถามของคุณโดยเฉพาะและสังเกตได้ง่าย แต่อาจไม่ได้รับการบันทึกไว้อย่างดี

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

ตามที่คุณสังเกตเห็น (ยกเว้น ngx_http_rewrite_module) ) เซิร์ฟเวอร์ บริบททำหน้าที่เหมือนค่าเริ่มต้น ที่ตั้งนั่นคือถ้าไม่มีอย่างอื่น ที่ตั้ง บล็อกตรงกับคำขอ การปรากฏตัวของความชัดเจน ที่ตั้ง / { ... } บล็อคจะมาก่อนเสมอ

Safar Safarli avatar
ar flag
ฉันเข้าใจแล้ว แต่คำถามของฉันเกี่ยวกับคำสั่ง "try_files" เป็นหลัก คุณช่วยกรุณาให้ข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ไหม ในกรณีนี้ในบริบทของเซิร์ฟเวอร์ ขอบคุณ
Richard Smith avatar
jp flag
ฉันไม่มีข้อมูลเพิ่มเติม อย่างที่บอกว่านี่เป็นพฤติกรรมที่สังเกตได้

โพสต์คำตอบ

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