URI เริ่มต้นด้วยเครื่องหมายทับสองตัว…พวกเขาทำงานอย่างไร?


93

เมื่อเร็ว ๆ นี้ผมได้เห็นการทำงานรหัสบล็อกเช่นนี้

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

และตาม RFC 2396 (URI Syntax) และ RFC 2616 (HTTP 1.1) URI เหล่านี้ที่เริ่มต้นด้วยเครื่องหมายทับสองอันนั้นใช้ได้ แต่น่าเสียดายที่ RFC ไม่ได้อธิบายอย่างแท้จริง

ใครช่วยชี้ให้ฉันดูแหล่งข้อมูลที่อธิบายว่าเบราว์เซอร์จะ / ควร / ดำเนินการกับ URI เหล่านี้ได้อย่างไร

คำตอบ:


86

ทรัพยากรที่คุณกำลังมองหาเป็นRFC 3986

ดูหัวข้อ 4.2 และข้อ 5.4 อ้างจากหลัง:

ตัวอย่างความละเอียดอ้างอิง

ภายในการแสดงด้วย URI ฐานที่กำหนดไว้อย่างดีของ:

    http://a/b/c/d;p?q

การอ้างอิงแบบสัมพัทธ์จะเปลี่ยนเป็น URI เป้าหมายดังนี้:

  "g:h"           =  "g:h"
  "g"             =  "http://a/b/c/g"
  "./g"           =  "http://a/b/c/g"
  "g/"            =  "http://a/b/c/g/"
  "/g"            =  "http://a/g"
  "//g"           =  "http://g"
  "?y"            =  "http://a/b/c/d;p?y"
  "g?y"           =  "http://a/b/c/g?y"
  "#s"            =  "http://a/b/c/d;p?q#s"
  "g#s"           =  "http://a/b/c/g#s"
  "g?y#s"         =  "http://a/b/c/g?y#s"
  ";x"            =  "http://a/b/c/;x"
  "g;x"           =  "http://a/b/c/g;x"
  "g;x?y#s"       =  "http://a/b/c/g;x?y#s"
  ""              =  "http://a/b/c/d;p?q"
  "."             =  "http://a/b/c/"
  "./"            =  "http://a/b/c/"
  ".."            =  "http://a/b/"
  "../"           =  "http://a/b/"
  "../g"          =  "http://a/b/g"
  "../.."         =  "http://a/"
  "../../"        =  "http://a/"
  "../../g"       =  "http://a/g"

ซึ่งหมายความว่าเมื่อ URI ฐานเป็นhttp://a/b/c/d;p?qและคุณใช้อ้างอิงญาติจะเปลี่ยนไป//ghttp://g


4
นี่อาจเป็นวิธีแก้ปัญหาในการใช้จาวาสคริปต์เพื่อกำหนด http หรือ https ด้วยวิธีนี้ไม่ว่ามันจะทำงานอะไร
Ibu

เนื่องจากคุณต้องไปถึงระดับผู้ปกครองใช้../g- http://a/b/c/gมันจะใช้โปรโตคอลในปัจจุบันและนำไปสู่การ
Boris S

อาจเป็นคำถามมือใหม่ แต่ URI ฐานนี้มาจากไหน? แถบ URL ของเบราว์เซอร์? เซิฟเวอร์? แท็กในหน้า html?
coderatchet

1
@thenaglecode: คำตอบคือมันขึ้นอยู่กับ ในรูปแบบ XML / XHTML / HTML5 คุณสามารถใช้xml:baseการตั้งค่าอย่างชัดเจนในองค์ประกอบใดโดยค่าเริ่มต้นใน HTML URI พื้นฐานจะเป็น URI เดียวกันของเพจ (แต่ภายในไฟล์ CSS URI พื้นฐานจะสัมพันธ์กับ CSS uri ไม่ใช่ HTML ที่มีแต่ IE รุ่นเก่าทำให้มันสัมพันธ์กับ HTML) ในโปรโตคอลและภาษาอื่นอาจแตกต่างกัน (ใน XSLT ขึ้นอยู่กับรายการปัจจุบันเป็นต้น) <html:base>ดูเพิ่มเติม
Abel

1
สำคัญ - ผลลัพธ์ไม่เสมอไปhttp! ขึ้นอยู่กับโปรโตคอลของบริบทเพจ ถ้าบริบทถูกโหลดภายใต้http://a/b/c/d;p?qแล้วแน่นอนหายไป//g http://gแต่ถ้าหน้าถูกโหลดเป็นแล้วผลจะเป็นhttp://a/b/c/d;p?q https://gและอย่าลืมเกี่ยวกับโปรโตคอลอื่น ๆ เช่นfile://(หน้าโหลดจากดิสก์) ซึ่งจะทำให้คุณปวดหัวมาก
Andrey Tserkus

62

นี่คือURL สัมพัทธ์ของโปรโตคอล พวกเขาชี้ไปที่ที่อยู่โดยรักษาโปรโตคอลปัจจุบัน

สัญลักษณ์นี้มักใช้เพื่อหลีกเลี่ยงปัญหา "เนื้อหาผสม" (ข้อความเตือนของ IE ที่บ่นเกี่ยวกับhttpและhttpsแหล่งข้อมูลในหน้า HTTPS เดียวกัน)

Update: เอกสารอย่างเป็นทางการใน RFC 3986:

การอ้างอิงแบบสัมพัทธ์ที่ขึ้นต้นด้วยอักขระทับสองตัวเรียกว่าการอ้างอิงเส้นทางเครือข่าย การอ้างอิงดังกล่าวมักไม่ค่อยถูกนำมาใช้ การอ้างอิงสัมพัทธ์ที่ขึ้นต้นด้วยอักขระสแลชเดี่ยวเรียกว่าการอ้างอิงพา ธ สัมบูรณ์ การอ้างอิงแบบสัมพัทธ์ที่ไม่ได้ขึ้นต้นด้วยอักขระสแลชเรียกว่าการอ้างอิงพา ธ สัมพัทธ์


ยินดีที่ทราบ แต่สิ่งนี้สอดคล้องกับเบราว์เซอร์ยอดนิยมอย่างไร การค้นหาอย่างรวดเร็วบอกฉันว่ามันใช้ไม่ได้กับ IE6 ... นี่คือฟีเจอร์ HTML5 หรือไม่?
Shane N

4
@ เชนสิ่งนี้ควรใช้ได้กับทุกเบราว์เซอร์ คุณมีลิงค์ที่อ้างว่าใช้ไม่ได้ใน IE6 หรือไม่?
Pekka

4
ค่อนข้างมั่นใจว่าเป็นคุณลักษณะของ IE1!
จอนฮันนา

บวกสำหรับการกล่าวถึงญาติโปรโตคอล
Tawfik Khalifeh

30

เป็น URL อิสระของโปรโตคอล หากหน้าเว็บแสดงบน https คำขอจะใช้ https หาก http ตามด้วย http

พอลไอริชดูเหมือนจะเป็นที่นิยมโดยรวมไว้ในรหัสสำเร็จรูปของเขา


1

จะตระหนักถึงว่ามันไม่ได้เป็นเพียงhttpหรือhttpsอิสระ แต่ยังไฟล์ , FTP , ฯลฯ

หมายความว่าหากคุณเปิดไฟล์. htmโดยตรงในเบราว์เซอร์ของคุณบน localhost เบราว์เซอร์จะแก้ไข//เป็นไฟล์โปรโตคอลและหน้าของคุณจะไม่ทำงาน อาจทำให้เกิดปัญหาในเว็บไซต์ที่อัดแน่นเป็นแอป "เนทีฟ" โดยใช้เครื่องมือเช่น Electron, PhoneGap เป็นต้น

ตัวอย่าง:

<script src="//mywebsite.com/resource.js"></script>

ถึง

<script src="file://mywebsite.com/resource.js"></script>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.