Est-il valide de remplacer http:// par / dans un?

j'ai l'élément suivant:

<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script>

dans ce cas, le site est HTTPS, mais le site peut aussi être HTTP. (Le fichier JS est sur un autre domaine.) Je me demande s'il est valide de faire ce qui suit pour des raisons de commodité:

<script type="text/javascript" src="//cdn.example.com/js_file.js"></script>

je me demande s'il est valide de supprimer le http: ou https: ?

cela semble fonctionner partout où j'ai testé, mais y a-t-il des cas où cela ne fonctionne pas?

441
demandé sur unor 2009-02-15 03:15:18
la source

13 ответов

une URL relative sans schéma (http: ou https:) est valide, par RFC 3986:" Uniform Resource Identifier (URI): Generic Syntax", Section 4.2 . Si un client s'étouffe, c'est la faute du client parce qu'il ne respecte pas la syntaxe URI spécifiée dans le RFC.

votre exemple est valide et devrait fonctionner. J'ai moi-même utilisé cette méthode D'URL relative sur des sites très fréquentés et je n'ai eu aucune plainte. Aussi, nous testons nos sites en Firefox, Safari, IE6, IE7 et Opera. Ces navigateurs comprennent tous ce format D'URL.

375
répondu Jeff 2012-08-02 22:52:34
la source

il est garanti de travailler dans n'importe quel navigateur grand public (Je ne prends pas les navigateurs avec moins de 0,05% de part de marché en considération). Heck, il fonctionne dans Internet Explorer 3.0.

RFC 3986 définit une URI comme étant composée des parties suivantes:

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment

lors de la définition de L'URIs relatif ( Section 5.2 ), vous pouvez omettre n'importe laquelle de ces sections, toujours à partir de la gauche. En pseudo-code, c' on dirait:

 result = ""

  if defined(scheme) then
     append scheme to result;
     append ":" to result;
  endif;

  if defined(authority) then
     append "//" to result;
     append authority to result;
  endif;

  append path to result;

  if defined(query) then
     append "?" to result;
     append query to result;
  endif;

  if defined(fragment) then
     append "#" to result;
     append fragment to result;
  endif;

  return result;

L'URI que vous décrivez est un URI relatif sans schéma.

147
répondu Andrew Moore 2010-06-06 23:25:38
la source

y a-t-il des cas où ça ne marche pas?

si la page mère a été chargée à partir de file:// , alors elle ne fonctionne probablement pas (elle va essayer d'obtenir file://cdn.example.com/js_file.js , que vous pouvez bien sûr fournir localement aussi).

76
répondu Thilo 2011-10-19 12:27:19
la source

beaucoup de gens appellent cela une URL relative de protocole.

Il provoque un double-télécharger des fichiers CSS sous IE 7 & 8 .

40
répondu SLaks 2010-06-04 19:58:05
la source

ici je duplique la réponse dans les traits cachés de HTML :

utilisant un absolu indépendant du protocole chemin d'accès:

<img src="//domain.com/img/logo.png"/>

si le navigateur affiche une page dans SSL via HTTPS, puis il demandera cet actif avec le protocole https, sinon, il le demandera avec HTTP.

Cela empêche l'horrible "sur Cette Page Contient à la fois sécurisé et Non sécurisé Items " message d'erreur dans IE, keeping toutes vos demandes d'actifs dans le même protocole.

avertissement: en cas d'utilisation sur un <link> ou @import pour une feuille de style, IE7 et IE8 téléchargez le fichier deux fois . Tous les autres les utilisations, cependant, sont très bien.

22
répondu kennytm 2017-05-23 13:31:22
la source

il est parfaitement valable de ne pas suivre le protocole. La spécification de L'URL est très claire à ce sujet depuis des années, et je n'ai pas encore trouvé de navigateur qui ne le comprenne pas. Je ne sais pas pourquoi cette technique n'est pas mieux connue; c'est la solution parfaite au problème épineux du franchissement des limites HTTP/HTTPS. Plus ici: transitions Http-https et URLs relatives

16
répondu Ned Batchelder 2011-10-19 12:54:16
la source

y a-t-il des cas où ça ne marche pas?

juste pour jeter cela dans le mix, si vous développez sur un serveur local, il pourrait ne pas fonctionner. Vous devez spécifier un schéma, sinon le navigateur peut supposer que src="//cdn.example.com/js_file.js" est src="file://cdn.example.com/js_file.js" , ce qui va casser puisque vous n'hébergez pas cette ressource localement.

Microsoft Internet Explorer semblent être particulièrement sensibles à cela, voir cette question: ne peut pas charger jQuery dans Internet Explorer sur localhost (WAMP)

Vous auriez probablement toujours essayer de trouver une solution qui fonctionne sur tous les environnements avec le moins de modifications nécessaires.

la solution utilisée par HTML5Boilerplate est d'avoir un repli lorsque la ressource n'est pas chargée correctement, mais cela ne fonctionne que si vous incorporez un contrôle:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

Mise à jour: HTML5Boilerplate utilise maintenant <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js après avoir décidé de déprécier les URLs relatives du protocole, voir [ici][3].

5
répondu bg17aw 2017-05-23 15:09:56
la source

suivant la référence du gnud, le RFC 3986 section 5.2 dit:

si l'élément du schéma est défini, en indiquant que la référence commence par un nom de schéma, puis la référence est interprété comme une URI absolu et nous sommes finis. dans le cas contraire, le régime de référence de L'URI est hérité de la composante de base URI de schéma .

Donc // est correct: -)

3
répondu Pablo Torrecilla 2016-02-25 10:46:42
la source

Oui, Ceci est documenté dans RFC 3986 , section 5.2:

(edit: Oups, mon RFC de référence a été dépassée).

2
répondu gnud 2010-06-04 19:55:51
la source

elle est en effet correcte, comme d'autres réponses l'ont indiqué. Vous devriez noter cependant, que certains moteurs de recherche Web déclencheront 404s pour ceux-ci en les demandant sur votre serveur comme si une URL locale. (Ils ne tiennent pas compte de la double barre oblique et la traitent comme une seule barre oblique).

vous pouvez configurer une règle sur votre serveur web pour les attraper et les rediriger.

par exemple, avec Nginx, vous ajouteriez quelque chose comme:

location ~* /(?<redirect_domain>((([a-z]|[0-9]|\-)+)\.)+([a-z])+)/(?<redirect_path>.*) {
  return 301 $scheme:/$redirect_domain/$redirect_path;
}

note de bien que, si vous utilisez des périodes dans votre URIs, vous aurez besoin d'augmenter la spécificité ou il finira par rediriger ces pages vers des domaines inexistants.

aussi, il s'agit d'un regex assez massif à exécuter pour chaque requête -- à mon avis, il est intéressant de punir les navigateurs non conformes avec 404s sur une (légère) performance frappé sur la majorité des navigateurs conformes.

2
répondu jlovison 2013-09-03 15:33:55
la source

nous voyons 404 erreurs dans nos logs en utilisant //somedomain.com comme références aux fichiers JS.

les références qui font sortir les 404s ressemblent à ceci: réf:

<script src="//somedomain.com/somescript.js" />

404 demande:

http://mydomain.com//somedomain.com/somescript.js

avec ceux-ci apparaissant régulièrement dans nos journaux de serveur web, il est sûr de dire que: tous les navigateurs et les Bots ne pas honorer RFC 3986 section 4.2. Le pari le plus sûr est d'inclure la protocole dès que possible.

2
répondu Lemiarty 2014-05-29 18:19:45
la source

le modèle que je vois sur HTML5-boilerplate est:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

il fonctionne en douceur sur différents plans comme http , https , file .

1
répondu neurite 2016-02-25 10:46:14
la source

comme votre exemple est un lien vers un domaine externe, si vous utilisez HTTPS, vous devez vérifier que le domaine externe est aussi configuré pour SSL. Sinon, vos utilisateurs peuvent voir des erreurs SSL et / ou des erreurs 404 (par exemple des versions plus anciennes de Plesk store HTTP et HTTPS dans des dossiers séparés). Pour les CDN, cela ne devrait pas être un problème, mais pour tout autre site Web, cela pourrait l'être.

sur une note latérale, testé lors de la mise à jour d'un ancien site web et fonctionne également dans l'url= partie D'un META REFRESH.

0
répondu user2246924 2018-04-26 02:27:41
la source

Autres questions sur html http https uri protocol-relative