กรณี nginx เขียนตายด้าน


15

ฉันพยายามทำให้ nginx เปลี่ยนเส้นทางของฉันให้สะอาดที่สุด ฉันเข้าใจ ~ * สำหรับตัวพิมพ์เล็กและตัวพิมพ์เล็ก แต่ฉันสามารถทำให้มันใช้ได้ในตัวอย่างที่ 2

ตัวอย่างที่ 1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

ตัวอย่างที่ 2 - ใช้งานได้ แต่ไม่มีประสิทธิภาพเท่าบรรทัดด้านบน

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }

มีวิธีการเปลี่ยนเส้นทางที่ไม่ตอบสนองต่อ case โดยใช้ตัวอย่างที่ 1 โดยไม่ทำให้มันเป็นโคลนหรือไม่?

ขอบคุณ

คำตอบ:


10

ฉันเพิ่งมี (และแก้ไข) ปัญหาเดียวกันนี้และลงเอยด้วยการพยายามหาคำตอบ เอกสาร nginx ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html ) ไม่ได้ระบุอย่างชัดเจนว่า ~ * ใช้ได้เฉพาะกับคำสั่ง if แต่เห็นได้ชัดว่าเป็นกรณี

ในการรับการจับคู่นิพจน์ปกติแบบไม่ตรงตามตัวพิมพ์สำหรับการเขียน URL ngnix นอกเหนือจากคำสั่ง if ฉันต้องใช้สไตล์ Apache / Perl:

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

ดูhttp://perldoc.perl.org/perlretut.html (ค้นหาการตาย) ดูเหมือนว่าคำนำหน้า (? i) ภายนอกกลุ่มการจับภาพที่เฉพาะเจาะจงทำให้มันใช้กับสตริงการค้นหาทั้งหมด หมายเหตุ: สิ่งนี้ดูเหมือนจะไม่ทำงานกับ "^ (? i) foobar" เพราะดูเหมือนว่า "^" นั้นส่อให้เห็น

แต่เพื่อให้แน่ใจว่าและเพื่อให้การเขียนในอนาคตง่ายขึ้นเพื่อรักษาและคลุมเครือน้อยลงหากคุณลงมือทำสิ่งเหล่านี้คุณอาจต้องการทำสิ่งนี้:

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}

หวังว่านี่จะช่วย ...


30

สิ่งที่ฉันได้พบเพื่อให้ทำงานนี้:

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

คุณต้องทำสิ่งนี้เท่านั้น:

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

นี่หมายถึง prepend (? i) และทุกอย่างจะเหมือนกันสำหรับการจับคู่


4
นี่ควรเป็นคำตอบที่ยอมรับได้
thekingoftruth

2
ขอขอบคุณ. ง่ายและยังหาได้ยากใน Nginx docs ขอขอบคุณตัวชี้ที่กระชับ!
PKHunter

1

ทำงานกับเว็บไซต์ในตอนนี้ฉันพบว่ามันทำงานได้ดีเช่นกัน สำหรับคนที่อยู่ในสถานการณ์เดียวกันฉันอยู่ในไม่กี่ชั่วโมงที่ผ่านมานี้

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.