URI, що починається з двох скісних рисок ... як вони поводяться?


92

Нещодавно я бачив такі робочі кодові блоки:

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

І відповідно до RFC 2396 (синтаксис URI) та 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і ви використовуєте //g, відносна посилання перетворюється на http://g.


4
так що це може бути рішенням для використання javascript для визначення http або https таким чином, як би це не було, це буде працювати
Ібу

Оскільки вам потрібно досягти батьківського рівня, використовуйте ../g- він використовуватиме поточний протокол і веде до http://a/b/c/g.
Борис С

Можливо, це питання для початківців, але звідки береться цей базовий URI? URL-адреса браузера? сервер? тег на HTML-сторінці?
кодерат

1
@thenaglecode: відповідь - це залежить. У XML / XHTML / HTML5 ви можете використовувати, xml:baseщоб явно встановити його для будь-якого елемента . За замовчуванням в HTML базовим URI є той самий URI сторінки (але всередині файлу CSS базовий URI є відносно CSI uri, не містить HTML , але старіший IE зробив його відносно HTML). В інших протоколах та мовах він може бути різним (наприклад, у XSLT це залежить від поточного елемента). Дивіться також <html:base>.
Абель

1
Важливо - результат не завжди http! Це залежить від протоколу контексту сторінки. Якщо контекст був завантажений під http://a/b/c/d;p?q, тоді //gдійсно вирішується до http://g. Але якщо сторінка була завантажена як http://a/b/c/d;p?qтоді, результат буде https://g. А також не забувайте про інші протоколи, як-от file://(сторінка завантажується з диска) - що, безумовно, доставить вам головний біль.
Андрій Церкус,

62

Це відносні URL-адреси протоколів.Вони вказують на адресу, зберігаючи поточний протокол.

Ці позначення часто використовуються для уникнення проблеми "змішаного вмісту" (попереджувальне повідомлення IE, яке скаржиться на httpтаhttps ресурси на тій самій сторінці HTTPS).

Оновлення: Офіційна документація у RFC 3986:

Відносне посилання, яке починається з двох косих символів, називається посиланням на мережевий шлях; такі посилання використовуються рідко. Відносне посилання, яке починається з одного косого символу, називається посиланням на абсолютний шлях. Відносне посилання, яке не починається з косої риски, називається посиланням на відносний шлях.


Чудово знати, але наскільки це відповідає популярним браузерам. Швидкий пошук сказав мені, що це не працює з IE6 ... це функція HTML5 ??
Шейн Н

4
@Shane це має працювати у всіх браузерах. У вас є посилання, яке стверджує, що це не працює в IE6?
Пекка

4
Цілком впевнений, що це функція IE1!
Jon Hanna

плюс за згадку про родича протоколу
Тавфік Халіф

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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.