nginx เขียนใหม่สำหรับ URL ที่มีพารามิเตอร์


16

ฉันมี URL ประเภทนี้:

http://www.example.com/?param1=val1&param2=&param3=val3&param4=val4&param5=val5

และฉันต้องการเปลี่ยนเส้นทางไปยังอันนี้:

http://www.example.com/newparam/val3/val4

ดังนั้นฉันได้ลองกฎการเขียนใหม่นี้โดยไม่ประสบความสำเร็จ:

rewrite "/?param1=val1&param2=&param3=(.+)&param4=(.+)&param5=(.+)" http://www.example.com/newparam/$1/$2 redirect;

nginx ไม่สามารถจัดการกับพารามิเตอร์การสืบค้นได้หรือไม่

แก้ไข:ฉันไม่ต้องการเขียนคำร้องทั้งหมด ฉันต้องเขียน URL นั้นใหม่โดยไม่ส่งผลกระทบต่อคนอื่น

คำตอบ:


15

ตกลงขอบคุณความช่วยเหลือเบื้องต้นของ rzab ฉันได้นิยามกฎของเขาใหม่ให้กับวิธีแก้ปัญหาการทำงานนี้:

location / {
    if ($args ~* "/?param1=val1&param2=&param3=[0-9]+&param4=.+&param5=[0-9]+") {
        rewrite ^ http://www.example.com/newparam/$arg_param3/$arg_param4? last;
    }
}

ฉันเพิ่งเพิ่มเงื่อนไขเพื่อหลีกเลี่ยงการเรียกซ้ำไม่สิ้นสุดและ a? ในตอนท้ายของกฎในการกำจัดของparams เริ่มต้น มันทำงานได้อย่างสมบูรณ์แบบ :)


1
สตริงการสืบค้นอนุญาตให้เรียงลำดับพารามิเตอร์ต่างกัน ดังนั้นคุณifจะหยุดทำงานเมื่อเช่นไปก่อนparam2 param1
Alexander Azarov

น่าสนใจ ในกรณีของฉันมันจะไม่เกิดขึ้นเพราะมันเป็น URL ที่คลิกได้ในอีเมล แต่ก็เป็นเรื่องดีที่จะรู้ ขอบคุณ
David Morales

4
สถานที่ = / {
  เขียนใหม่ ^ http://www.example.com/newparam/$arg_param3/$arg_param4;
}

ดังนั้นฉันต้องเขียน $ arg_ แล้วชื่อพารามิเตอร์?
David Morales

ใช่ว่าจะง่ายที่สุด
Martin Fjordvald

ตกลง แต่ฉันไม่ต้องการเขียนคำร้องใหม่ทั้งหมด ฉันต้องเขียน URL นั้นใหม่โดยไม่ส่งผลกระทบต่อคนอื่น
David Morales

ฉันได้ทำการทดสอบ กฎนั้นจะสร้างการเปลี่ยนเส้นทางแบบไม่สิ้นสุด ฉันจะเขียนคำตอบใหม่ด้วยรหัสที่ฉันได้ทำงาน ขอบคุณ :)
David Morales

ฉันน่าจะพูดถึงว่าคุณต้องประกาศ "location /" นอกจาก "location = /" เพื่อหลีกเลี่ยงการเรียกซ้ำ ฉันเดาว่าคุณจะต้องใช้ proxy_pass ที่ไหนสักแห่งในเส้นทางหลัก "location = /" ตรงกับ / คำขอทั้งหมด อย่างไรก็ตามการจับคู่ $ args ดูเหมือนว่าจะใช้ได้ยกเว้นว่าตรงกับคำขอใด ๆกับพารามิเตอร์หรือไม่ param1 = val1 & ....
rzab
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.