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?

Ответы:


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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.