Score:1

ใช้ URL ที่มีอักขระพิเศษในแผนที่ nginx

ธง in

เมื่อใช้ 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 ตาม แปลงสตริงเป็นเลขฐานสิบหกในบรรทัดคำสั่งดังนั้นที่เก็บข้อมูลแผนที่จึงถูกสร้างขึ้นในหน่วยความจำด้วยค่าที่ถูกต้องสำหรับ ถ้า การทดสอบคำสั่ง

มันเริ่มรู้สึกเหมือนเป็นวิทยาศาสตร์จรวด และฉันไม่อยากเชื่อเลยว่าจะไม่มีใครแก้ปัญหานี้มาก่อน ดูเหมือนฉันจะหาทางออกไม่ได้

Ivan Shatsky avatar
gr flag
ตรวจสอบบทความ [การจับคู่อักขระที่ไม่ใช่ ASCII ในตำแหน่ง NGiNX](https://blog.rabin.io/quick-tip/matching-non-ascii-characters-in-nginx-location) และลิงก์ที่อ้างถึง
us flag
ฉันคิดว่าคุณเข้าใจผิดคำว่า URN ที่นี่ คุณควรใช้คำว่า URI ที่นี่ URN เป็นตัวระบุที่ไม่ซ้ำกันสำหรับทรัพยากร และองค์ประกอบเส้นทางของ URL นั้นไม่ซ้ำกัน
in flag
@TeroKilkanen ชี้ประเด็นไปแล้ว เปลี่ยนหัวข้อตามคำขอ... ยังแก้ไม่ได้ แต่ผมไม่ยอมแพ้ มันเกิดขึ้นที่ backburner สำหรับตอนนี้ ...

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา