มีเครื่องหมายคำถามมากกว่าหนึ่งรายการใน URL หรือไม่


92

วันนี้ฉันเจอ URL ต่อไปนี้:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

สังเกตเครื่องหมายคำถามสองเท่าที่จุดเริ่มต้นของสตริงข้อความค้นหา:

??blogid=122&entry_id=64497

ดูเหมือนว่าเบราว์เซอร์ของฉันจะไม่มีปัญหาใด ๆ และเรียกใช้ bookmarklet อย่างรวดเร็ว:

javascript:alert(document.location.search);

เพิ่งให้สตริงข้อความค้นหาที่แสดงด้านบน

นี่คือ URL ที่ถูกต้องหรือไม่ เหตุผลที่ฉันเป็นคนอวดดี (สมมติว่าฉันเป็น) เป็นเพราะฉันต้องแยกวิเคราะห์ URL แบบนี้สำหรับพารามิเตอร์การค้นหาและการรองรับเครื่องหมายคำถามสองเท่าจะต้องมีการเปลี่ยนแปลงบางอย่างกับโค้ดของฉัน แน่นอนว่าถ้าพวกมันอยู่ในป่าฉันจะต้องสนับสนุนพวกมัน ฉันสงสัยเป็นหลักว่าเป็นความผิดของฉันที่ไม่ปฏิบัติตามมาตรฐาน URL อย่างแน่นอนหรือว่าเป็น URL ที่ไม่ได้มาตรฐาน


โชคดีที่ถึงอย่างนั้นฉันก็ไม่จำเป็นต้องเปลี่ยนรหัส ฉันใช้indexOf()เพื่อค้นหาเครื่องหมายคำถามดังนั้นมันจึงเลือกตำแหน่งของเหตุการณ์แรก แล้วผมแยก query_parameters ออกในแต่ละ&แล้วชื่อ / =คู่ค่าของพวกเขาในแต่ละ
Bungle

คำตอบ:


108

ใช่มันถูกต้อง เฉพาะตัวแรก ?ใน URL เท่านั้นที่มีความสำคัญหลังจากนั้นจะถือว่าเป็นเครื่องหมายคำถามตามตัวอักษร:

คอมโพเนนต์การสืบค้นระบุด้วยเครื่องหมายคำถามแรก ("?") อักขระและสิ้นสุดด้วยอักขระเครื่องหมายตัวเลข ("#") หรือต่อท้าย URI

...

อักขระทับ ("/") และเครื่องหมายคำถาม ("?") อาจแสดงถึงข้อมูลภายในคอมโพเนนต์การสืบค้น ระวังว่าการนำไปใช้งานที่เก่ากว่าและผิดพลาดบางอย่างอาจไม่สามารถจัดการข้อมูลดังกล่าวได้อย่างถูกต้องเมื่อใช้เป็น URI พื้นฐานสำหรับการอ้างอิงแบบสัมพัทธ์ (ส่วนที่ 5.1) เห็นได้ชัดว่าเป็นเพราะพวกเขาไม่สามารถแยกความแตกต่างของข้อมูลการสืบค้นจากข้อมูลเส้นทางเมื่อค้นหาตัวคั่นแบบลำดับชั้น อย่างไรก็ตามเนื่องจากคอมโพเนนต์ของคิวรีมักถูกใช้เพื่อดำเนินการระบุข้อมูลในรูปแบบของคู่ "คีย์ = ค่า" และค่าที่ใช้บ่อยค่าหนึ่งเป็นการอ้างอิงถึง URI อื่นบางครั้งการใช้งานจะดีกว่าในการหลีกเลี่ยงการเข้ารหัสเปอร์เซ็นต์อักขระเหล่านั้น

http://tools.ietf.org/html/rfc3986#section-3.4


9
นั่นหมายความว่าพารามิเตอร์การค้นหาแรกมีชื่อว่า "? blogid" ไม่ใช่ "blogid"? มันอาจจะสนุก ...
GalacticCowboy

3
@GalacticCowboy - ใช่สิ่งเดียวกันที่เพิ่งเกิดขึ้นกับฉัน คุณถูกต้อง - ยืนยัน Firebug ?blogidว่าพารามิเตอร์การค้นหาครั้งแรกในความเป็นจริง ดูเหมือนว่าจะเป็นพารามิเตอร์ที่ไม่จำเป็นกล่าวคือหน้าเว็บจะแสดงเหมือนกันโดยมีเครื่องหมายคำถามจำนวนเท่าใดก็ได้ที่นั่นหรือไม่ใส่พารามิเตอร์ทั้งหมด
Bungle

27

เป็นคำตอบที่เกี่ยวข้องกับการสัมผัส, foo?spam=1?&eggs=3ให้พารามิเตอร์spamค่า1?


ใช่. ในกรณีที่ไม่มี.htaccessหรือเทคนิคที่คล้ายกัน ถ้าเราเปลี่ยนfooไปscript.phpและทำให้คำขอนี้script.php?spam=1?&eggs=3แล้วvar_dump($_GET)แสดงให้เห็นarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.