URI bắt đầu bằng hai dấu gạch chéo… chúng hoạt động như thế nào?


92

Gần đây tôi thấy làm việc mã khối như thế này:

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

Và theo RFC 2396 (Cú pháp URI) và RFC 2616 (HTTP 1.1), các URI này bắt đầu bằng hai dấu gạch chéo là hợp lệ, nhưng tiếc là RFC không thực sự giải thích chúng.

Bất cứ ai có thể chỉ cho tôi một tài nguyên giải thích cách trình duyệt sẽ / nên / làm gì xử lý các URI này không?

Câu trả lời:


86

Tài nguyên bạn đang tìm là RFC 3986 .

Xem Phần 4.2 và Phần 5.4. Trích dẫn từ sau:

Các ví dụ về độ phân giải tham chiếu

Trong một biểu diễn có URI cơ sở được xác định rõ ràng của:

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

một tham chiếu tương đối được chuyển đổi thành URI mục tiêu của nó như sau:

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

Điều này có nghĩa là khi URI cơ sở là http://a/b/c/d;p?qvà bạn sử dụng //g, thì tham chiếu tương đối được chuyển thành http://g.


4
vì vậy đây có thể là một giải pháp để sử dụng javascript để xác định http hoặc https cách này bất cứ điều gì nó là nó sẽ làm việc
Ibu

Vì bạn cần đạt đến cấp độ cha mẹ, hãy sử dụng ../g- nó sẽ sử dụng giao thức hiện tại và dẫn đến http://a/b/c/g.
Boris S

Nó có thể là một câu hỏi dành cho người mới, nhưng URI cơ sở này đến từ đâu? thanh url của trình duyệt? máy chủ? một thẻ trong trang html?
coderatchet

1
@thenaglecode: câu trả lời là, nó phụ thuộc. Trong XML / XHTML / HTML5, bạn có thể sử dụng xml:baseđể đặt nó một cách rõ ràng trên bất kỳ phần tử nào . Theo mặc định trong HTML, URI cơ sở là cùng một URI của trang (nhưng bên trong tệp CSS, URI cơ sở có liên quan đến uri CSS, không phải HTML chứa , nhưng IE cũ hơn đã đặt nó liên quan đến HTML). Trong các giao thức và ngôn ngữ khác, nó có thể khác (ví dụ: trong XSLT, nó phụ thuộc vào mục hiện tại). Xem thêm <html:base>.
Abel

1
Quan trọng - kết quả không phải luôn luôn http! Nó phụ thuộc vào giao thức của ngữ cảnh trang. Nếu ngữ cảnh được tải dưới http://a/b/c/d;p?q, thì //gthực sự sẽ giải quyết thành http://g. Nhưng nếu trang được tải như vậy http://a/b/c/d;p?qthì kết quả sẽ là https://g. Và cũng đừng quên về các giao thức khác như file://(trang được tải từ đĩa) - điều chắc chắn sẽ khiến bạn rất đau đầu.
Andrey Tserkus,

62

Đây là các URL tương đối của giao thức. Chúng trỏ đến một địa chỉ, giữ nguyên giao thức hiện tại.

Ký hiệu này thường được sử dụng để tránh vấn đề "nội dung hỗn hợp" (một thông báo cảnh báo IE phàn nàn về httphttpstài nguyên trên cùng một trang HTTPS).

Cập nhật: Tài liệu chính thức trong RFC 3986:

Tham chiếu tương đối bắt đầu bằng hai ký tự gạch chéo được gọi là tham chiếu đường dẫn mạng; những tài liệu tham khảo như vậy hiếm khi được sử dụng. Một tham chiếu tương đối bắt đầu bằng một ký tự gạch chéo được gọi là tham chiếu đường dẫn tuyệt đối. Tham chiếu tương đối không bắt đầu bằng ký tự gạch chéo được gọi là tham chiếu đường dẫn tương đối.


Thật tuyệt khi biết, nhưng điều này tuân thủ như thế nào với các trình duyệt phổ biến. Một tìm kiếm nhanh cho tôi biết nó không hoạt động với IE6 ... đây có phải là một tính năng HTML5 không ??
Shane N ngày

4
@Shane điều này sẽ hoạt động trong tất cả các trình duyệt. Bạn có liên kết nào cho rằng nó không hoạt động trong IE6 không?
Pekka

4
Khá chắc chắn rằng đó là một tính năng của IE1!
Jon Hanna

cộng với việc đề cập đến họ hàng của giao thức
Tawfik Khalifeh


1

Hãy lưu ý rằng nó không chỉ độc lập với http hoặc https mà còn cả tệp , ftp , v.v.

Có nghĩa là nếu bạn mở tệp .htm trực tiếp trong trình duyệt của mình trên localhost, trình duyệt sẽ giải quyết // dưới dạng giao thức tệp và trang của bạn sẽ không hoạt động. Nó có thể gây ra sự cố trong các trang web được đóng gói dưới dạng ứng dụng "gốc" bằng cách sử dụng các công cụ như Electron, PhoneGap, v.v.

Thí dụ:

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

đến

<script src="file://mywebsite.com/resource.js"></script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.