เหตุใดเปอร์เซ็นต์การลงชื่อเข้าใช้ URL ทำให้เกิดข้อผิดพลาดคำขอ HTTP 400 ไม่ถูกต้อง


22

ฉันบังเอิญพบสิ่งนี้โดยบังเอิญเมื่อพิมพ์ URL ผิดพลาดสำหรับหน้าเว็บในเว็บเบราว์เซอร์ของฉัน

ทำไมการเยี่ยมชมhttp://example.com/%ทำให้เกิดข้อผิดพลาด HTTP 400 คำขอไม่ถูกต้องถูกโยนทิ้ง เซิร์ฟเวอร์คาดหวังสิ่งอื่นหลังจากหรือก่อนเครื่องหมายเปอร์เซ็นต์หรือไม่

ดูเหมือนว่าจะเกิดขึ้นสำหรับเซิร์ฟเวอร์ Apache และ Nginx


คำตอบ:


32

คำตอบสั้น ๆ

ตามRFC 3986%อักขระตัวเปล่าไม่ใช่ไวยากรณ์URI ที่ถูกต้อง ควรตามด้วยเลขฐานสิบหกที่มีความหมายสองหลัก

คำตอบที่ยาว

HTTPรหัสสถานะที่คุณได้รับอยู่ใน4xxระดับ:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

ที่มา: การลงทะเบียนรหัสสถานะ Hypertext Transfer Protocol (HTTP)

โดยเฉพาะอย่างยิ่งรหัส400ถูกกำหนดโดยInternet Engineering Task Force (IETF) ในRFC 2616:

10.4.1 400 คำขอไม่ถูกต้อง

เซิร์ฟเวอร์ไม่สามารถเข้าใจการร้องขอได้เนื่องจากไวยากรณ์ผิดรูปแบบ ลูกค้าไม่ควรทำซ้ำการร้องขอโดยไม่มีการดัดแปลง

ที่มา: RFC 2616 - Hypertext Transfer Protocol - HTTP / 1.1

อ้างถึงวิกิพีเดีย (เหมืองเน้นตัวหนา):

ตัวละครที่ได้รับอนุญาตใน URI มีทั้งลิขสิทธิ์หรือตรงไปตรงมา ( หรือตัวละครที่ร้อยละเป็นส่วนหนึ่งของการเข้ารหัสเปอร์เซ็นต์ )

แหล่งที่มา: การเข้ารหัสร้อยละ - การเข้ารหัสเป็นเปอร์เซ็นต์ใน URI

หากคุณต้องการที่จะแทรกตัวอักษรสัญลักษณ์คุณจำเป็นต้องใช้การแสดงเปอร์เซ็นต์เข้ารหัส:%%25

อ่านเพิ่มเติม


ฉันไม่เข้าใจ ถ้าฉันปิดบังสัญลักษณ์ '%' ด้วย '% 25' ไฟล์จะยังคงไม่แสดง แต่ข้อผิดพลาด 400 จะถูกโยนในสถานการณ์ของเรา (Apache -> JKMount -> Tomcat)
fiffy

หากคุณมี RewriteRule ต่อไปนี้RewriteRule (.*) xyz/$1(โดยที่ xyz เป็นชื่อโฟลเดอร์ใด ๆ ) ใน. htaccess คุณควรดับเบิลเข้ารหัสรหัส% เป็น% 2525
Marco Marsala

9

เครื่องหมายเปอร์เซ็นต์ใช้สำหรับแทรกอักขระที่ปกติแล้วไม่รองรับใน url ตัวอย่างเช่น% 20 จะเหมือนกับช่องว่าง


4
และเพื่อแทรกตัวละครที่เป็นเปอร์เซ็นต์เอง%25
Robotnik

A +เป็นวิธีลัดในการเข้ารหัสช่องว่าง หากคุณต้องการเครื่องหมายบวกจริงให้ใช้รหัส hex,% 2B
Phil Perry

3
+ เป็นการเข้ารหัสที่ถูกต้องสำหรับช่องว่างเฉพาะภายในสตริงแบบสอบถาม % 20 เป็นการเข้ารหัสที่ถูกต้องที่อื่นภายใน URL
Eden Townsend
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.