URI, начинающийся с двух косых черт… как они себя ведут?

93

В последнее время я видел такие рабочие блоки кода:

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

pagid
источник

Ответы:

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 таким образом, независимо от того, что это будет работать
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 относится к uri CSS, а не к содержащему его 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://(страница загружается с диска), что, безусловно, доставит вам много головной боли.
Андрей Церкус
62

Это относительные URL-адреса протокола. Они указывают на адрес, сохраняя текущий протокол.

Это обозначение часто используется, чтобы избежать проблемы «смешанного содержимого» (предупреждающее сообщение IE о жалобах httpи httpsресурсах на той же странице HTTPS).

Обновление: официальная документация в RFC 3986:

Относительная ссылка, которая начинается с двух символов косой черты, называется ссылкой на сетевой путь; такие ссылки используются редко. Относительная ссылка, которая начинается с одного символа косой черты, называется ссылкой абсолютного пути. Относительная ссылка, которая не начинается с символа косой черты, называется ссылкой относительного пути.

Пекка
источник
Приятно знать, но насколько это совместимо с популярными браузерами. Быстрый поиск сказал мне, что он не работает с IE6 ... это функция HTML5 ??
Shane N
4
@Shane, это должно работать во всех браузерах. У вас есть ссылка, по которой она не работает в IE6?
Pekka
4
Совершенно уверен, что это функция IE1!
Джон Ханна
плюс за упоминание родственника протокола
Тауфик Халифе
1

Имейте в виду , что это не только HTTP или HTTPS независимы, но и файл , FTP и т. Д.

Это означает, что если вы откроете файл .htm прямо в браузере на локальном хосте, браузер будет разрешать // как файловый протокол. и ваша страница не будет работать. Это может вызвать проблемы на упакованных веб-сайтах как «родное» приложение с использованием таких инструментов, как Electron, PhoneGap и т. Д.

Пример:

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

к

<script src="file://mywebsite.com/resource.js"></script>
Люкер
источник