รายการอักขระที่ถูกต้องสำหรับตัวระบุส่วนย่อยใน URL?


87

ฉันใช้ตัวระบุส่วนเพื่อสร้างลิงก์ถาวรสำหรับเหตุการณ์ AJAX ในเว็บแอปของฉันที่คล้ายกับผู้ชายคนนี้ สิ่งที่ต้องการ:

http://www.myapp.com/calendar#filter:year/2010/month/5

ฉันได้ทำการค้นหาค่อนข้างน้อย แต่ไม่พบรายการอักขระที่ถูกต้องสำหรับ idenitifer ส่วนย่อย ข้อมูลจำเพาะ W3Cไม่ได้มีอะไร

ฉันจำเป็นต้องเข้ารหัสอักขระให้เหมือนกับ URL โดยทั่วไปหรือไม่?

ดูเหมือนจะไม่มีข้อมูลที่ดีในทุกที่

คำตอบ:


100

ดูRFC 3986

fragment    = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"    
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

ดังนั้นคุณสามารถใช้!, $, &, ', (, ), *, +, ,, ;, =บางสิ่งบางอย่างที่ตรงกับ%[0-9a-fA-F]{2}สิ่งที่จับคู่[a-zA-Z0-9], -, ., _, ~, :, @, /และ?


สมบูรณ์แบบฉันกำลังมองหาสิ่งนั้นใน RFC แต่ดูเหมือนจะไม่พบประโยคที่ถูกต้อง ขอบคุณ.
sohtimsso1970

1
@Artefacto หมายความว่าไม่อนุญาตให้ใช้ "%" ทุกที่ แต่อนุญาตเฉพาะเมื่ออักขระที่ถูกต้องสองตัวตามหลัง
Pacerier

1
@Pacerier ใช่%อนุญาตให้ใช้เป็นอักขระหลีกเท่านั้น ใช้%25เข้ารหัสไฟล์%.
gioele

1
ปุ่มย้อนกลับ / ไปข้างหน้าไม่ทำงานกับตัวระบุส่วนที่มีเครื่องหมายจุดคู่แม้ว่า RFC จะระบุว่าเป็นอักขระที่ถูกต้อง
Vince

1
ว้าว! คงจะง่ายกว่าถ้าจะบอกว่าตัวละคร ascii ตัวไหนใช้ไม่ได้!
e2-e4

31

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

fragment    = *( pchar / "/" / "?" )

และ

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
pct-encoded   = "%" HEXDIG HEXDIG

ดังนั้นรวมชิ้นส่วนไม่สามารถมี#, ดิบ%, ^, [, ], {, }, \, ", <และ>ตามอา


ขอบคุณ. ให้คำตอบแก่ Artefacto เนื่องจากเขาเป็นคนผมยาวเร็วกว่า แต่ให้ +1 สำหรับคำตอบ
sohtimsso1970

2
ฉันคิดว่าคุณไม่มีอักขระ ASCII ที่ไม่สามารถพิมพ์ได้และอักขระที่ไม่ใช่ ascii
Artefacto

2
ดูเหมือนว่าคุณลืมVERTICAL BAR (|)และGRAVE ACCENT (`)และSPACE ( )ในอนาคตที่ไม่รายการ ดังนั้นรายการอักขระ US-ASCII ที่สามารถพิมพ์ได้ (7 บิต) ทั้งหมดในรายการที่ไม่อยู่ในรายการคือ:"#%< >[\]^`{|}
GitaarLAB

2

RFC อื่น ๆ พูดถึงเรื่องนี้: RFC-1738

URL schemeparts for ip based protocols:
HTTP

httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
hpath          = hsegment *[ "/" hsegment ]
hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.