nginx เขียนใหม่ต่อท้ายพารามิเตอร์ที่ท้าย url


13

ฉันต้องกำหนดค่าพร็อกซีย้อนกลับของฉันเพื่อที่จะเพิ่มพารามิเตอร์ต่อไปนี้ในตอนท้ายของ url: &locale=de-de

เกือบจะใช้งานได้:

rewrite ^(.*)$ $1&locale=de-de break;

อย่างไรก็ตามปัญหาคือฉันต้องผนวก '& locale = de-de' เฉพาะเมื่อยังไม่มีอยู่และถ้ามี '?' ใน URL ...

ฉันสามารถขอความช่วยเหลือในการกำหนด regex ที่ถูกต้องเพื่อทำสิ่งนี้ได้ไหม?

คำถามอื่น: ทำไมเครื่องหมายคำถามใน URL ของฉันไม่แสดงถ้าฉันใช้สิ่งนี้:
$ uri? $ args

หรือ $ uri $ is_args $ args แปล URL ที่ไม่ได้เข้ารหัสและเครื่องหมายคำถามจะแสดงเป็น% 3f

ไอเดีย?

แก้ไข: ดูเหมือนว่าพฤติกรรมนี้มีอยู่ในขณะที่ใช้ร่วมกับ proxy_pass ในการเขียนง่าย ๆ มันใช้งานได้ดีจริงๆ

คำตอบ:


15
  1. ในrewriteคุณตรงกับส่วนเส้นทางของ URL เท่านั้น ซึ่งหมายความว่า$1จะไม่มีสตริงการสืบค้น
  2. โดยค่าเริ่มต้น Nginx ผนวกสตริงแบบสอบถามต้นฉบับเพื่อแทนที่การเขียนซ้ำ

ดังนั้นควรเขียนให้ปลอดภัย

rewrite ^(.*)$ $1?locale=de-de break;

ในกรณีที่คุณไม่ต้องการให้ Nginx ต่อท้ายสตริงการสืบค้นดั้งเดิมเพียงระบุ?ในตอนท้ายของ URL การแทนที่:

rewrite ^(.*)$ $1?locale=de-de? break;

ขอบคุณ! ฉันไม่เห็นว่าฉันพยายามทำในทางที่ผิด
Sascha

A + นี่คือคำตอบที่ดีที่สุด
ขอบคุณ

3

การจับคู่สำหรับrewriteไม่รวมพารามิเตอร์การสืบค้นดังนั้นคุณต้องทดสอบสำหรับที่อื่น

ลอง:

if ($args !~* locale=de\-de){
    rewrite ^(.*)$ $1&locale=de-de last;
}


@Alexander จุดดี; ที่rewriteจำเป็นต้องมีlastหากปลอดภัย แก้ไข
เชนหัวเสีย

3

กระบวนการrewriteไม่ได้แก้ไขพารามิเตอร์คำร้องขอเฉพาะส่วนของพา ธ ของ URI จากประสบการณ์ของฉันการใช้การเขียนซ้ำทำให้เกิดวงจรแปลก ๆ ซึ่งพารามิเตอร์ใหม่จะได้รับการผนวกเข้ากับโฆษณา การเขียนซ้ำอาจไม่ใช่วิธีการนี้ใน Nginx

คุณควรแก้ไข$argsตัวแปรโดยใช้setคำสั่ง:

set $args $args&locale=de-de;

ฉันไม่เห็นด้วยที่$argsควรจะกลายพันธุ์ ให้ดูโซลูชันของ @ AlexanderAzarov แทน
ขอบคุณ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.