URI dimulai dengan dua garis miring… bagaimana perilakunya?

93

Akhir-akhir ini saya melihat blok kode yang berfungsi seperti ini:

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

Dan menurut RFC 2396 (URI Syntax) dan RFC 2616 (HTTP 1.1) URI ini yang dimulai dengan dua garis miring adalah valid, tetapi sayangnya RFC tidak benar-benar menjelaskannya.

Adakah yang bisa mengarahkan saya ke sumber daya yang menjelaskan bagaimana browser akan / harus / melakukan proses URI ini?

pagid
sumber

Jawaban:

86

Sumber daya yang Anda cari adalah RFC 3986 .

Lihat Bagian 4.2 dan Bagian 5.4. Mengutip dari yang terakhir:

Contoh Resolusi Referensi

Dalam representasi dengan URI dasar yang ditentukan dengan baik dari:

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

referensi relatif diubah menjadi URI targetnya sebagai berikut:

  "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"

Ini berarti bahwa saat URI dasar adalah http://a/b/c/d;p?qdan Anda gunakan //g, referensi relatif diubah menjadi http://g.

Daniel Vassallo
sumber
4
jadi ini bisa menjadi solusi untuk menggunakan javascript untuk menentukan http atau https dengan cara apapun itu akan bekerja
Ibu
Karena Anda perlu mencapai level induk, gunakan ../g- ini akan menggunakan protokol saat ini dan mengarah ke http://a/b/c/g.
Boris S
Ini mungkin pertanyaan pemula, tapi dari mana asal URI dasar ini? bilah url browser? server? tag di halaman html?
coderatchet
1
@thenaglecode: jawabannya adalah, tergantung. Dalam XML / XHTML / HTML5 Anda dapat menggunakan xml:baseuntuk mengaturnya secara eksplisit pada elemen apa pun . Secara default dalam HTML, URI dasar adalah URI halaman yang sama (tetapi di dalam file CSS, URI dasar relatif terhadap uri CSS, bukan HTML yang berisi , tetapi IE yang lebih lama membuatnya relatif terhadap HTML). Dalam protokol dan bahasa lain, ini bisa berbeda (dalam XSLT, tergantung pada item saat ini, misalnya). Lihat juga <html:base>.
Abel
1
Penting - hasilnya tidak selalu http! Itu tergantung pada protokol konteks halaman. Jika konteks dimuat di bawah http://a/b/c/d;p?q, maka //gmemang memutuskan untuk http://g. Tetapi jika halaman itu dimuat http://a/b/c/d;p?qmaka hasilnya akan seperti itu https://g. Dan juga jangan lupa tentang protokol lain seperti file://(halaman dimuat dari disk) - yang pasti akan membuat Anda banyak pusing.
Andrey Tserkus
62

Ini adalah URL relatif protokol. Mereka menunjuk ke sebuah alamat, dengan tetap menggunakan protokol saat ini.

Notasi ini sering digunakan untuk menghindari masalah "konten campuran" (keluhan pesan peringatan IE httpdan httpssumber daya pada halaman HTTPS yang sama).

Pembaruan: Dokumentasi resmi di RFC 3986:

Referensi relatif yang dimulai dengan dua karakter garis miring disebut referensi jalur jaringan; referensi semacam itu jarang digunakan. Referensi relatif yang dimulai dengan karakter garis miring tunggal disebut referensi jalur absolut. Referensi relatif yang tidak dimulai dengan karakter garis miring disebut referensi jalur-relatif.

Pekka
sumber
Senang mengetahui, tetapi seberapa sesuai ini dengan browser populer. Pencarian cepat memberi tahu saya bahwa ini tidak berfungsi dengan IE6 ... apakah ini fitur HTML5 ??
Shane N
4
@Shane ini seharusnya berfungsi di semua browser. Apakah Anda memiliki tautan yang mengklaim tidak berfungsi di IE6?
Pekka
4
Cukup yakin bahwa yang satu ini adalah fitur IE1!
Jon Hanna
plus untuk menyebutkan protokol relatif
Tawfik Khalifeh
30

Mereka adalah url protokol independen. Jika halaman web disajikan di https maka permintaan menggunakan https, jika http maka http.

Paul Irish tampaknya telah mempopulerkannya dengan memasukkannya ke dalam kode boilerplate-nya.

meder omuraliev
sumber
1

Ketahuilah bahwa ini bukan hanya http atau https yang independen, tetapi juga file , ftp , dll.

Artinya jika Anda membuka file .htm langsung di browser Anda di localhost, browser akan menyelesaikan // sebagai protokol file dan halaman Anda tidak akan berfungsi. Ini dapat menyebabkan masalah di situs web yang dikemas sebagai aplikasi "asli" menggunakan alat seperti Electron, PhoneGap, dll.

Contoh:

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

untuk

<script src="file://mywebsite.com/resource.js"></script>
lukyer
sumber