เมื่อใช้ nginx และแมป เป็นไปได้ที่จะเขียน URL หลายรายการใหม่ด้วยไฟล์แมป สิ่งที่เป็นปัญหาคือเมื่อ URL มีอักขระพิเศษ ฉันหัวแตกกับการพยายามทำให้ถูกต้อง และหวังว่าคำถาม/วิธีแก้ปัญหานี้จะช่วยคนอื่นไม่ให้กลายเป็นผมหงอกได้
มาตั้งสถานการณ์กันเถอะ
เซิร์ฟเวอร์ Linux (Debian/Ubuntu) ที่ใช้ nginx มาตรฐาน
DNS ชี้ไปที่เซิร์ฟเวอร์นี้ซึ่งแก้ไขการกำหนดค่าเซิร์ฟเวอร์
แผนที่ที่ไม่มีรายการซ้ำกับ URL ขาเข้าและขาออก (แก้ไขได้)
การตั้งค่าแผนที่จะประกอบด้วยสิ่งต่อไปนี้:
แผนที่ $host$request_uri $rewrite_uri {
รวม /<เส้นทางไปยังชื่อไฟล์>;
}
ไฟล์แผนที่มีหนึ่งรายการต่อบรรทัดที่ลงท้ายด้วยเครื่องหมายอัฒภาค
example.com/Böhme https://anotherexample.org/SomeWeirdPath/Böhme;
การกำหนดค่าเซิร์ฟเวอร์สำหรับการแมปนี้ให้ทำงาน
เซิร์ฟเวอร์ {
ฟัง 443 ssl http2;
ssl_certificate /<พาธสัมบูรณ์ไปยังไฟล์ crt>;
ssl_certificate_key /<พาธสัมบูรณ์ไปยังไฟล์คีย์>;
server_name example.com;
proxy_set_header X-ส่งต่อ-สำหรับ $remote_addr;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers สูง:!aNULL:!MD5;
ssl_dhparam <พาธสัมบูรณ์ไปยังคีย์ Diffie Hellman>;
add_header การขนส่งที่เข้มงวด - ความปลอดภัย "อายุสูงสุด = 31536000; includeSubDomains";
ปิด server_tokens;
ถ้า ($rewrite_uri) {
เขียนใหม่ ^ $rewrite_uri เปลี่ยนเส้นทาง;
}
rewrite ^ <default URL> เปลี่ยนเส้นทาง;
}
ฉันได้ทำให้การกำหนดค่าของเซิร์ฟเวอร์นี้ง่ายขึ้นเพื่อให้เราสามารถมุ่งเน้นไปที่การตั้งค่าแผนที่การกำหนดค่าจะถือว่าโดเมนจะใช้ SSL และใบรับรองนั้นถูกต้อง คำสั่ง if จะทำงานก็ต่อเมื่อ $host$request_uri อยู่ในรายการที่มี $rewrite_uri มิฉะนั้น การเขียนซ้ำครั้งล่าสุดจะถูกดำเนินการ
คำถาม
ฉันจะแปลง $request_uri เพื่อให้ nginx เข้าใจถูกต้องได้อย่างไร ไฟล์แผนที่มีค่าเป็น UTF8 แต่ดูเหมือนว่า nginx ต้องการ $request_uri URL-Encoded และเป็นเลขฐานสิบหก
$request_uri ใน mapfile
example.com/Böhme
$request_uri URLเข้ารหัสตามเบราว์เซอร์
example.com/B%C3%B6hme
$request_uri เพราะฉันคิดว่า nginx ต้องการ
example.com/B\xC3\xB6hme
ดูเหมือนว่าฉันไม่พบแพ็คเกจระบบที่มีคุณสมบัตินี้ แต่ฉันคิดว่าฉันกำลังเริ่มคิดค้นวงล้อใหม่ที่นี่
ฉันจะต้อง:
สร้างฟังก์ชั่นที่จะเข้ารหัส URL รายการ
ตาม จะถอดรหัสสตริงที่เข้ารหัส URL ในเชลล์ได้อย่างไร
ฟังก์ชั่น urldecode () { ท้องถิ่น i = "${*//+/ }"; echo -e "${i//%/\x}"; }
จากนั้นใช้ Octal dump ตาม แปลงสตริงเป็นเลขฐานสิบหกในบรรทัดคำสั่งดังนั้นที่เก็บข้อมูลแผนที่จึงถูกสร้างขึ้นในหน่วยความจำด้วยค่าที่ถูกต้องสำหรับ ถ้า การทดสอบคำสั่ง
มันเริ่มรู้สึกเหมือนเป็นวิทยาศาสตร์จรวด และฉันไม่อยากเชื่อเลยว่าจะไม่มีใครแก้ปัญหานี้มาก่อน ดูเหมือนฉันจะหาทางออกไม่ได้