Nginx: ตำแหน่ง regex สำหรับหลายเส้นทาง


30

ฉันมีสองสถานที่ในการกำหนดค่า nginx ที่ทำงาน:

location ^~ /media/ {
  proxy_pass http://backend.example.com;
}

location ^~ /static/ {
  proxy_pass http://backend.example.com;
}

ฉันจะรวมสองสิ่งนี้เข้าด้วยกันในที่เดียวได้อย่างไร

สิ่งที่ฉันทำไปแล้ว:

ฉันลองคำแนะนำนี้

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}

แต่มันไม่ได้ผลสำหรับฉัน

นอกจากนี้เมื่อฉันไม่ได้ใช้แบ็กเอนด์การกำหนดค่าต่อไปนี้ทำงานอย่างถูกต้อง:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

ปรับปรุง (บางสายจากบันทึก)

xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /content/11160/ HTTP/1.1" 200 5310 "-" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68"
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/font-awesome/css/font-awesome.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/bootstrap/css/bootstrap.min.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/css/custom.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/53$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/colorbox.css HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Sa$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/colorbox/jquery.colorbox-min.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.$
xx.xx.xx.xx - - [31/Dec/2013:13:48:18 +0000] "GET /static/js/scripts.js HTTP/1.1" 404 200 "http://www.example.com/content/11160/" "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537$

วิธีการแก้

ที่จริงโซลูชันของฉันทำงานได้ดี:

location ~ ^/(static|media)/ {
  root /home/project_root;
}

และปัญหาไม่เกี่ยวข้องกับแบ็กเอนด์ ในขณะที่ Guido Vaccarella สังเกตเห็นได้อย่างถูกต้องมันเพิ่งตามหลังคนอื่นlocation ~ ...ที่เข้าคู่กันดังนั้นฉันlocation ~ ...จึงไม่มีโอกาสวิ่ง


ฉันไม่เห็นว่าทำไมการผ่านพรอกซีของ regex ของคุณไม่ทำงาน จะเกิดอะไรขึ้นเมื่อคุณลองทำ
พอใจ

เมื่อฉันลองใช้ส่วนหน้า nginx จะพ่นข้อผิดพลาด 404
Vlad T.

) ในตอนท้ายของคำสั่งตำแหน่งที่ตั้งเป็นเพียงข้อผิดพลาดในคำถามของคุณหรือยังอยู่ในไฟล์กำหนดค่าของคุณหรือไม่
Guido Vaccarella

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

โปรดระบุข้อผิดพลาดจากบันทึกข้อผิดพลาด
Mohammad AbuShady

คำตอบ:


30

ตามเอกสารของ nginx :

จากนั้นตรวจสอบนิพจน์ทั่วไปตามลำดับที่ปรากฏในไฟล์กำหนดค่า การค้นหานิพจน์ทั่วไปสิ้นสุดลงในการแข่งขันนัดแรกและใช้การกำหนดค่าที่เกี่ยวข้อง

ในการกำหนดค่าของคุณตำแหน่งต่อไปนี้จะถูกกำหนดไว้ก่อนที่จะมี proxy_pass และตรงกับคำขอของไฟล์ js และ css ภายใต้สแตติก :

  location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires max;
    log_not_found off;
  }

น่าเสียดายประโยค "log_not_found off" ปิดใช้งานการบันทึกสำหรับข้อผิดพลาดที่ไม่พบไฟล์ที่เกี่ยวข้องกับตำแหน่งนี้นั่นเป็นสาเหตุที่ error_log ของคุณว่างเปล่า!

คุณสามารถลองคอมเม้นท์ที่ตั้งนี้หรือย้ายไปที่อื่นด้วย proxy_pass (หากคุณต้องการไฟล์อื่น ๆ ที่ไม่ได้อยู่ในสแตติก / สื่อบันทึก )


13
location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
)     <-----------

ควรจะเป็น...

location ~ ^/(static|media)/ {
  proxy_pass http://backend.example.com;
}     <-----------

การปิดต้องเป็นวงเล็บปีกกา {} ไม่ใช่วงเล็บเหลี่ยม ()

ไม่อยากจะเชื่อเลยว่ามันต้องใช้เวลานานเท่าไหร่ กุยโด้พูดถูก


โอ้ขอโทษสำหรับความเข้าใจผิดฉันคิดว่ามันหมายถึงวงเล็บหลังจาก "สื่อ" |media)ในสตริงเริ่มต้นด้วย "สถานที่" แต่วงเล็บปีกกาที่ผิดที่นี่เป็นเพียงการพิมพ์ผิด (แก้ไขในคำถาม) มิฉะนั้นการกำหนดค่า nginx นี้จะไม่สามารถโหลดได้และจะทำให้เกิดข้อผิดพลาดอย่างunexpected ")"...ขออภัยอีกครั้ง
ว. ต. ต.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.