เครื่องมือทดสอบการจับคู่ location ของ Nginx
วาง config ของ nginx และ request URI เพื่อดูว่า location block ไหนชนะและเพราะอะไร ทำงานตามลำดับการจับคู่ที่ nginx ระบุไว้ คือ exact, ^~, regex ตามลำดับในไฟล์ และ prefix ที่ยาวที่สุด พร้อม trace การตัดสินใจครบทุกขั้น ทำงานในเบราว์เซอร์ทั้งหมด
Loading tool...
เครื่องมือทดสอบการจับคู่ location ของ Nginx คืออะไร?
Nginx Location Match Tester เป็น static analyzer ที่ตอบคำถามเดียวโดยเฉพาะ คือ request URI นี้ nginx จะเลือก location block ไหน และเพราะอะไร วางเฉพาะ location block จาก config พร้อมกับ URI แล้วเครื่องมือจะ normalize URI แบบที่ nginx ทำ ทั้ง percent-decode, รวม slash ซ้ำ และ resolve dot segment จากนั้นจึงไล่ลำดับการตัดสินใจตามเอกสาร คือถ้ามี exact match ก็ชนะทันที ถ้าไม่มีก็จำ prefix ที่ยาวที่สุดไว้ และถ้า prefix นั้นมี ^~ ก็ชนะทันที ถ้าไม่มีก็ไล่ regex location ตามลำดับที่ปรากฏโดยตัวแรกที่ match ชนะ ถ้าไม่มี regex ใด match จึงใช้ prefix ที่จำไว้ ทุกขั้นจะแสดงเป็น trace ที่มีลำดับเลข และ location block ทุกตัวจะได้คำตัดสินว่าเหตุใดจึงชนะหรือแพ้
ประโยชน์หลัก
- เปลี่ยนบั๊กการ route ที่สับสนให้เป็นคำอธิบายเรียงลำดับชัดเจน แทนการเดาว่า block ไหนควรชนะ
- เผยขั้นตอน normalize ทำให้ percent-escape, slash ซ้ำ และ dot segment ไม่เป็นเหตุผลลึกลับที่ทำให้การจับคู่น่าประหลาดใจอีก
- ทำให้ ^~ มองเห็นได้ว่าเป็นการตัดจบโดยตั้งใจ ไม่ใช่สาเหตุลึกลับที่ทำให้ regex หยุดทำงาน
- ชี้ปัญหาลำดับ regex เพราะตัวที่ match ก่อนตามลำดับไฟล์ชนะ ไม่ใช่ pattern ที่เจาะจงที่สุด
- บอกข้อจำกัดของตัวเองเป็น warning ทั้ง nested location, named location, if block และ regex เฉพาะ PCRE แทนที่จะตอบอย่างมั่นใจแต่ผิด
กรณีการใช้งาน
- •ไล่หาสาเหตุที่ request หนึ่งตกไปอยู่ catch-all หรือ location block ผิดตัวหลังแก้ config
- •ตรวจ config ก่อน deploy ว่า path ที่อ่อนไหวอย่าง /admin/ หรือ /api/ ไปถึง block ไหนจริง
- •ใช้สอนหรือเรียนรู้ลำดับการจับคู่ของ nginx ด้วย config จริงพร้อมผลตอบกลับทันทีแบบทีละขั้น
- •ตรวจว่า prefix ที่มี ^~ ปิดการทำงานของ regex location ที่เพื่อนร่วมทีมคาดว่าจะรันไปแล้วหรือไม่
- •ทำความเข้าใจว่า URI ที่ percent-encode หรือมี dot segment เล็ดลอดกฎที่อิงกับ path ไปได้อย่างไร
วิธีทดสอบว่า request จะเข้า location block ไหนของ nginx
- วาง location block ของคุณ: คัดลอกส่วน location จาก config ของ nginx ใส่หรือไม่ใส่ server block ครอบก็ได้ ระบบจัดการ comment และข้อความในเครื่องหมายคำพูดให้ หรือจะกดโหลดตัวอย่างที่มีมาให้ก็ได้
- ใส่ request URI: พิมพ์ path ที่ต้องการทดสอบ เช่น /api/v2/users?id=7 ระบบจะ normalize query string, percent-escape, slash ซ้ำ และ dot segment ก่อน เหมือนที่ nginx ทำก่อนจับคู่
- อ่าน block ที่ชนะและ trace: ผลลัพธ์จะบอก location ที่ถูกเลือกพร้อม modifier และเลขบรรทัด และ trace การตัดสินใจด้านล่างจะแสดงทุกขั้น รวมถึงขั้นที่ถูกข้ามและเหตุผลที่ข้าม
- ดูตาราง candidate และ warning: location block ทุกตัวจะถูกแสดงพร้อมเหตุผลที่ชนะหรือแพ้ ทำให้เห็นว่ากฎข้อไหนแทรกก่อนตัวที่คุณคาดไว้ และ warning จะบอกถึง nested location, named location, if block และ regex เฉพาะ PCRE ที่เครื่องมือนี้ยังไม่จำลอง
คุณสมบัติหลัก
- ไล่ลำดับการจับคู่ตามที่ nginx ระบุไว้ คือ exact match ก่อน จากนั้นเทียบ ^~ กับการข้ามขั้น regex แล้วไล่ regex ตามลำดับในไฟล์ สุดท้ายจึงใช้ prefix ที่ยาวที่สุด
- normalize request URI แบบที่ nginx ทำ ทั้ง percent-decode, รวม slash ซ้ำ และ resolve dot segment ก่อนเปรียบเทียบทุกอย่าง
- แสดง trace การตัดสินใจแบบมีลำดับเลข ครบทุกขั้นที่รัน ขั้นที่ถูกข้าม และขั้นที่ถูกตัดจบ จึงเป็นการอธิบายผลลัพธ์ไม่ใช่แค่บอกผล
- แสดง location block ทุกตัวพร้อมคำตัดสินว่า match แล้วชนะ, match แต่แพ้กฎที่เจาะจงกว่า หรือไม่ match เลย
- รายงานข้อจำกัดของตัวเองเป็น warning ทั้ง nested location, named location, if block และ regex ที่เป็น syntax เฉพาะของ PCRE แทนการเดาคำตอบ
- ชี้เคสที่มักทำให้เกิดปัญหาในโปรดักชัน ทั้งการขาด catch-all, regex ที่ไม่ได้ anchor และ prefix ที่มี ^~ ซึ่งปิดการทำงานของ regex อย่างเงียบ ๆ