URI commençant par deux barres obliques… comment se comportent-ils?

92

Dernièrement, j'ai vu des blocs de code fonctionnels comme celui-ci:

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

Et selon RFC 2396 (syntaxe URI) et RFC 2616 (HTTP 1.1), ces URI commençant par deux barres obliques sont valides, mais malheureusement les RFC ne les expliquent pas vraiment.

Quelqu'un peut-il me diriger vers une ressource qui explique comment les navigateurs traiteront / devraient / traiteront ces URI?

pagide
la source

Réponses:

86

La ressource que vous recherchez est la RFC 3986 .

Voir les sections 4.2 et 5.4. Citant ce dernier:

Exemples de résolution de référence

Dans une représentation avec un URI de base bien défini de:

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

une référence relative est transformée en son URI cible comme suit:

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

Cela signifie que lorsque l'URI de base est http://a/b/c/d;p?qet que vous l'utilisez //g, la référence relative est transformée en http://g.

Daniel Vassallo
la source
4
Cela peut-il être une solution à l'utilisation de javascript pour déterminer http ou https de cette façon, quoi qu'il en soit, cela fonctionnera
Ibu
Puisque vous devez atteindre le niveau parent, utilisez ../g- il utilisera le protocole actuel et mènera à http://a/b/c/g.
Boris S
C'est peut-être une question novice, mais d'où vient cet URI de base? la barre d'URL du navigateur? le serveur? une balise dans la page html?
coderatchet
1
@thenaglecode: la réponse est, cela dépend. Dans XML / XHTML / HTML5, vous pouvez utiliser xml:basepour le définir explicitement sur n'importe quel élément . Par défaut en HTML, l'URI de base est le même URI de la page (mais à l'intérieur d'un fichier CSS, l'URI de base est relatif à l' URI CSS, pas au HTML contenant , mais plus ancien IE le rendait par rapport au HTML). Dans d'autres protocoles et langages, cela peut être différent (en XSLT, cela dépend de l'élément courant, par exemple). Voir aussi <html:base>.
Abel
1
Important - le résultat n'est pas toujours http! Cela dépend du protocole du contexte de la page. Si le contexte a été chargé sous http://a/b/c/d;p?q, alors se //grésout effectivement à http://g. Mais si la page a été chargée comme http://a/b/c/d;p?qalors le résultat sera https://g. Et n'oubliez pas non plus les autres protocoles comme file://(la page est chargée à partir du disque) - qui vous donneront certainement beaucoup de maux de tête.
Andrey Tserkus
62

Ce sont des URL relatives au protocole. Ils pointent vers une adresse, en gardant le protocole actuel.

Cette notation est souvent utilisée pour éviter le problème de «contenu mixte» (un message d'avertissement IE se plaignant de ressources httpet httpssur la même page HTTPS).

Mise à jour: documentation officielle dans la RFC 3986:

Une référence relative commençant par deux barres obliques est appelée une référence de chemin réseau; ces références sont rarement utilisées. Une référence relative qui commence par un seul caractère barre oblique est appelée une référence de chemin absolu. Une référence relative qui ne commence pas par une barre oblique est appelée une référence de chemin relatif.

Pekka
la source
Bon à savoir, mais à quel point cela est-il compatible avec les navigateurs populaires. Une recherche rapide m'a dit que cela ne fonctionne pas avec IE6 ... est-ce une fonctionnalité HTML5 ??
Shane N
4
@Shane cela devrait fonctionner dans tous les navigateurs. Avez-vous un lien affirmant qu'il ne fonctionne pas dans IE6?
Pekka
4
À peu près sûr que c'est une fonctionnalité IE1!
Jon Hanna
plus pour mentionner le protocole relatif
Tawfik Khalifeh
1

Sachez que ce n'est pas seulement indépendant de http ou https , mais aussi de fichier , ftp , etc.

Cela signifie que si vous ouvrez le fichier .htm directement dans votre navigateur sur localhost, le navigateur résoudra // en tant que protocole de fichier et votre page ne fonctionnera pas. Cela peut causer des problèmes dans les sites Web emballés en tant qu'application «native» utilisant des outils tels que Electron, PhoneGap, etc.

Exemple:

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

à

<script src="file://mywebsite.com/resource.js"></script>
Lukyer
la source