เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ · URL ตัวเข้ารหัสและตัวถอดรหัส
กายวิภาคของ URL: อธิบายโครงร่าง อำนาจ เส้นทาง ข้อความค้นหา และส่วนย่อย
· พื้นหลัง
โครงสร้าง URL มาตรฐานเว็บ เครื่องมือสำหรับนักพัฒนา
การตัดสินใจเข้ารหัสเปอร์เซ็นต์ทุกครั้งขึ้นอยู่กับส่วนของ URL ที่อักขระอยู่ โพสต์นี้ตั้งชื่อองค์ประกอบทั้งห้าจาก RFC 3986 แสดงให้เห็นว่าตัวคั่นแต่ละตัวหมายถึงอะไร และเหตุใดแฟรกเมนต์จึงไม่ไปถึงเซิร์ฟเวอร์
เหตุใด # เดียวกันจึงใช้ได้ในที่เดียวและทำลายลิงก์ในอีกที่หนึ่ง — คำถามส่วนประกอบ ไม่ใช่คำถามเกี่ยวกับตัวละคร
อักขระแฮช (#) ใน URL หมายถึงสิ่งต่าง ๆ โดยสิ้นเชิง ขึ้นอยู่กับตำแหน่งที่ปรากฏ ภายในค่าสตริงการสืบค้น เช่น ?search=C%23sharp จะต้องเข้ารหัสเป็น %23 เพื่อความปลอดภัย ที่ส่วนท้ายของ URL เช่น https://example.com/page#section, จะทำเครื่องหมายตัวคั่นแฟรกเมนต์และทุกสิ่งที่อยู่หลังจากนั้นคือแฟรกเมนต์ หนึ่งตัวละคร สองบริบท สองความหมายที่แตกต่างกัน นี่คือสาเหตุที่การตัดสินใจเข้ารหัสขึ้นอยู่กับการรู้ว่าส่วนใดของ URL ที่คุณกำลังร่วมงานด้วย
เครื่องหมายคำถาม (?) ก็มีลักษณะสองประการเช่นกัน ภายในเส้นทางหรือค่าการสืบค้น จะต้องเข้ารหัสเป็น %3F เพื่อให้ปรากฏเป็นข้อมูล เนื่องจากเป็นอักขระสัญพจน์ระหว่างเส้นทางและสตริงการสืบค้น จึงเป็นไวยากรณ์โครงสร้าง การทำความเข้าใจองค์ประกอบทั้งห้านี้ ได้แก่ แบบแผน อำนาจ เส้นทาง ข้อความค้นหา และส่วนย่อย เป็นรากฐานของการจัดการ URL ที่ถูกต้อง
ส่วนประกอบทั้งห้า: แบบแผน สิทธิ์ เส้นทาง การสืบค้น แฟรกเมนต์ และตัวคั่นที่แยกส่วนประกอบเหล่านั้น
RFC 3986 กำหนดอย่างเป็นทางการว่า URL มีห้าองค์ประกอบ: แบบแผน อำนาจ เส้นทาง ข้อความค้นหา และส่วน แยกจากกันด้วยตัวคั่นเฉพาะ Scheme มาก่อน ตามด้วย ://, จากนั้นให้สิทธิ์ จากนั้น /, จากนั้นจึงตามด้วยเส้นทาง จากนั้น ? จากนั้นตามด้วยแบบสอบถาม จากนั้น # จากนั้นจึงเป็นแฟรกเมนต์ คอมโพเนนต์บางส่วนอาจไม่ปรากฏในทุกๆ URL URL ขั้นต่ำอาจมีเพียงรูปแบบและเส้นทาง เช่น "mailto:user@example.com" URL แบบเต็มประกอบด้วยทั้งห้ารายการ
แต่ละองค์ประกอบมีกฎไวยากรณ์ของตัวเอง เครื่องหมายทวิภาคถูกสงวนไว้ในแบบแผน, เครื่องหมายทับในเส้นทาง, เครื่องหมายและในแบบสอบถาม อักขระที่สงวนไว้จำเป็นต้องมีการเข้ารหัสเมื่อปรากฏเป็นข้อมูล: เครื่องหมายทับในค่าเส้นทางจะกลายเป็น %2F
ภายในหน่วยงาน - ข้อมูลผู้ใช้ โฮสต์ และพอร์ต และทำไม @ และ : จึงถูกสงวนไว้ที่นั่น
องค์ประกอบสิทธิ์ประกอบด้วยที่อยู่เครือข่ายของทรัพยากร: ชื่อผู้ใช้ รหัสผ่าน ชื่อโฮสต์ และพอร์ต รูปแบบคือ [userinfo@]host[:port] ข้อมูลผู้ใช้และโฮสต์จะถูกคั่นด้วย @; โฮสต์และพอร์ตถูกคั่นด้วย: อักขระ @ และ : เหล่านี้ถูกสงวนไว้ภายในสิทธิในการจำกัดส่วนประกอบย่อยเหล่านี้ หากคุณมีชื่อผู้ใช้ที่มีสัญลักษณ์ @ จะต้องเข้ารหัสเปอร์เซ็นต์ก่อนที่จะเชื่อมต่อ ตัวอย่างเช่น "user@email.com:password" เป็นชื่อผู้ใช้จะกลายเป็น "user%40email.com:password" ก่อน @ สุดท้าย
ชื่อโฮสต์อาจเป็นโดเมนที่จดทะเบียน เช่น example.com ที่อยู่ IP ในรูปแบบทศนิยมแบบจุด เช่น 192.0.2.1 หรือที่อยู่ IPv6 ที่อยู่ในวงเล็บ เช่น [::1] พอร์ตนี้เป็นทางเลือก หากละเว้น รูปแบบจะกำหนดค่าเริ่มต้น (80 สำหรับ http, 443 สำหรับ https ฯลฯ) ส่วน userinfo ไม่ค่อยได้ใช้ใน URL สมัยใหม่ แต่ยังคงเป็นส่วนหนึ่งของไวยากรณ์
ส่วนเส้นทางและความหมายของ / — โครงสร้างลำดับชั้นและความละเอียดของส่วนจุด
เส้นทางคือลำดับของส่วนที่คั่นด้วยเครื่องหมายทับ เส้นทาง /a/b/c มีสามส่วน: a, b และ c แต่ละเซ็กเมนต์สามารถประกอบด้วยอักขระที่ไม่ได้สงวนไว้ อักขระที่เข้ารหัสเป็นเปอร์เซ็นต์ หรืออักขระที่สงวนไว้บางตัวที่ปลอดภัยในบริบทนี้ เครื่องหมายทับภายในส่วนจะต้องเข้ารหัสเป็น %2F เพื่อหลีกเลี่ยงความสับสนกับตัวคั่นส่วน เส้นทางเป็นแบบลำดับชั้น มันบอกเป็นนัยว่า a คือสถานที่ ดังนั้น a/b มีความเฉพาะเจาะจงมากขึ้น
เส้นทางยังรองรับส่วนของจุดพิเศษด้วย: จุดเดียว (.) หมายถึง "ไดเรกทอรีปัจจุบัน" และสองจุด (..) หมายถึง "ไดเรกทอรีหลัก" เส้นทางเช่น ../../etc/passwd แก้ไขขึ้นไป URL สมัยใหม่และ HTTP หลีกเลี่ยงการใช้สิ่งเหล่านี้ แต่มีอยู่ในรูปแบบไวยากรณ์ ส่วนเส้นทางที่มีจุดตามตัวอักษรหรือจุดสองจุดจะต้องได้รับการเข้ารหัสเป็นเปอร์เซ็นต์ หากไม่ได้ตั้งใจให้หมายถึงจุดตามตัวอักษร
ข้อความค้นหาและแฟรกเมนต์ - แบบแผนคีย์-ค่า และเหตุใดแฟรกเมนต์จึงยังคงอยู่ในเบราว์เซอร์
สตริงการสืบค้นตามเส้นทางและขึ้นต้นด้วย ? โดยทั่วไปแล้วจะเป็นชุดของคู่คีย์=ค่าที่คั่นด้วย & แม้ว่าจริงๆ แล้วไวยากรณ์จะไม่มีโครงสร้าง อะไรก็ตามที่รวมอยู่ในแบบสอบถามได้ หากคุณมีค่าที่มี & หรือ = อักขระเหล่านั้นจะต้องเข้ารหัสเป็นเปอร์เซ็นต์ เพื่อไม่ให้เข้าใจผิดว่าเป็นตัวคั่น แบบสอบถามถูกส่งไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์ตัดสินใจว่าจะทำอย่างไรกับมัน
แฟรกเมนต์ติดตามแบบสอบถามและขึ้นต้นด้วย # ทุกสิ่งที่อยู่หลัง # เป็นเพียงส่วนย่อย และจะไม่ไปถึงเซิร์ฟเวอร์เลย เบราว์เซอร์จะจัดการแฟรกเมนต์ภายในเครื่อง โดยปกติจะข้ามไปยังจุดยึดที่มีชื่อหรือเพื่อระบุสถานะภายในแอปพลิเคชันหน้าเดียว เนื่องจากแฟรกเมนต์ไม่เคยเข้าถึงเซิร์ฟเวอร์ URL ที่มีแฟรกเมนต์ที่แตกต่างกันจะถือว่าชี้ไปยังทรัพยากรเดียวกัน
ตัวอย่างการทำงาน: การแยกโลกแห่งความจริงอันยาวนาน URL — การติดป้ายกำกับทุกองค์ประกอบและทุกตัวคั่น
รับ URL "https://user:pass@example.com:8080/path/to/page?search=hello&sort=date#results". โครงการคือ https สิทธิ์คือ user:pass@example.com:8080 แบ่งออกเป็น userinfo (ผู้ใช้: pass), โฮสต์ (example.com) และพอร์ต (8080) เส้นทางคือ /path/to/page, พร้อมเส้นทางเซ็กเมนต์ ถึง และเพจ แบบสอบถามคือ search=hello&sort=date ซึ่งมีพารามิเตอร์สองตัว ส่วนคือผลลัพธ์ ป้อน URL นี้ลงในตัวเข้ารหัสและตัวถอดรหัส URL เพื่อดูว่าเครื่องมือติดป้ายกำกับและเข้ารหัสแต่ละองค์ประกอบอย่างไร
หากการค้นหามี & เช่น ?search=R&D จะกลายเป็น ?search=R%26D เมื่อเข้ารหัสอย่างถูกต้อง อักขระที่เข้ารหัสเป็นเปอร์เซ็นต์ไม่ได้สร้างขอบเขตการมองเห็นในข้อความ ดังนั้นการเข้ารหัสและถอดรหัสอย่างระมัดระวังจึงเป็นสิ่งจำเป็นอย่างยิ่งสำหรับการแยกวิเคราะห์ที่ถูกต้อง
สิ่งนี้ไม่ครอบคลุม — ความละเอียดในการอ้างอิงแบบสัมพันธ์และโครงร่างพิเศษ เช่น mailto: และข้อมูล:
การอ้างอิงเชิงสัมพันธ์ เช่น "../page" หรือ "?query=value" นั้นใช้ได้ภายใน HTML และตีความโดยสัมพันธ์กับเอกสารปัจจุบัน แต่มีกฎการแก้ไขแยกต่างหาก รูปแบบพิเศษ เช่น mailto:, data: และ file: เป็นไปตามกฎที่แตกต่างกันโดยสิ้นเชิง และไม่ใช่ URL สัมบูรณ์มาตรฐาน
โพสต์นี้เน้นเฉพาะโครงสร้าง URL แบบสัมบูรณ์มาตรฐานที่แสดงโดยผู้ตรวจสอบเท่านั้น การอ้างอิงแบบสัมพันธ์จำเป็นต้องมีฐาน URL ก่อนที่จะสามารถตีความส่วนประกอบต่างๆ ได้ ในขณะที่โครงร่าง เช่น mailto และข้อมูล ไม่ได้ใช้รูปแบบสิทธิ์และเส้นทางเดียวกัน การแยกกรณีเหล่านั้นออกจากกันจะป้องกันไม่ให้กฎที่เรียนรู้จากที่อยู่ HTTPS ถูกนำมาใช้อย่างสุ่มสี่สุ่มห้ากับไวยากรณ์ที่มีตัวคั่น ขั้นตอนการแก้ไข หรือพฤติกรรมการขนส่งที่แตกต่างกัน
ประเด็นสำคัญ: รู้จักส่วนประกอบก่อนที่คุณจะเข้ารหัส — วิธีการทำงานของโหมดค่าเดียวและที่อยู่ทั้งหมดของตัวเข้ารหัสและตัวถอดรหัส URL แมปกับโครงสร้างนี้อย่างไร
ส่วนประกอบที่คุณกำลังเข้ารหัสจะกำหนดว่าอักขระใดที่ต้องหลบหนีและอักขระใดที่ปลอดภัย เครื่องหมายทับคือไวยากรณ์ตามตัวอักษรในเส้นทาง ดังนั้นเครื่องหมายทับในค่าต้องเป็น %2F ในการสืบค้น & และ = จะต้องเข้ารหัสหากปรากฏในค่า ตัวเข้ารหัสและตัวถอดรหัส URL มีสองโหมด: "ส่วนประกอบ" สำหรับการเข้ารหัสค่าเดียว และ "ที่อยู่ทั้งหมด" สำหรับ URL ที่สมบูรณ์ ใช้โหมดคอมโพเนนต์เมื่อสร้าง URL โดยการต่อส่วนต่างๆ ใช้โหมดที่อยู่ทั้งหมดเพื่อตรวจสอบ URL ที่มีอยู่
การรู้องค์ประกอบทั้งห้าและตัวคั่นจะช่วยให้คุณเลือกได้อย่างถูกต้องทุกครั้งที่พบงานการเข้ารหัส