web-dev-qa-db-fra.com

Puis-je changer tous mes liens http: // en seulement //?

Dave Ward dit,

La lecture n’est pas très claire, mais section 4.2 de la RFC 3986 fournit des URL entièrement qualifiées qui omettent complètement le protocole (HTTP ou HTTPS). Lorsqu'un protocole d'URL est omis, le navigateur utilise à la place le protocole du document sous-jacent.

En termes simples, ces URL "sans protocole" permettent à une référence comme celle-ci de fonctionner dans tous les navigateurs sur lesquels vous allez l'essayer:

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

Cela semble étrange au début, mais cette URL "sans protocole" est le meilleur moyen de faire référence à du contenu tiers disponible via HTTP et HTTPS.

Cela résoudrait certainement un tas d'erreurs de contenu mixte que nous constatons sur les pages HTTP - en supposant que nos ressources soient disponibles via HTTP et HTTPS.

Est-ce complètement compatible avec tous les navigateurs? Y a-t-il d'autres mises en garde?

237
a paid nerd

Je l'ai testé à fond avant la publication. Parmi tous les navigateurs disponibles pour tester Browsershots , je n’en ai trouvé qu’un qui ne gère pas correctement l’URL relative au protocole: un obscur navigateur * nix appelé Dillo .

J'ai reçu des commentaires sur deux inconvénients:

  1. Les URL sans protocole peuvent ne pas fonctionner comme prévu lorsque vous "ouvrez" un fichier local dans votre navigateur, car le protocole de base de la page sera fichier: ///. Surtout lorsque vous utilisez l'URL sans protocole pour une ressource externe telle qu'un actif hébergé sur un CDN. L'utilisation d'un serveur Web local tel qu'Apache ou IIS pour effectuer un test - http: // localhost adresses fonctionne bien.
  2. Apparemment, il existe au moins une application de lecture de flux pour iPhone qui ne gère pas correctement les URL sans protocole. Je ne sais pas qui a le problème ou à quel point il est populaire. Pour héberger un fichier JavaScript, ce n'est pas un gros problème puisque les lecteurs RSS ignorent généralement le contenu JavaScript. Toutefois, si vous utilisez ces URL pour des supports tels que des images à l'intérieur d'un contenu devant être syndiqué via RSS, cela pourrait poser problème (toutefois, cette application de lecteur unique sur une plate-forme unique représente probablement un nombre très marginal de lecteurs).
201
Dave Ward

La question de savoir si on pourrait changer tous leurs liens pour qu'ils soient relatifs au protocole peut être discutable, étant donné la question de savoir si on devrait le faire. Selon Paul Irish :

2014.12.17: Maintenant que SSL est encouragé pour tout le monde et ne pose pas de problèmes de performances, cette technique est désormais un anti-modèle. Si l'actif dont vous avez besoin est disponible sur SSL, alors utilisez toujours le https: // atout.

37
Ohad Schneider

Si vous utilisez des URL sans protocole pour charger des feuilles de style, IE 7 & 8 les téléchargera deux fois: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download /

Donc, cela doit être évité pour CSS si vous aimez les bonnes performances.

30
Tim Beadle

Oui, les références de chemin d'accès réseau étaient déjà spécifiées dans RFC 1808 et devraient fonctionner avec tous les navigateurs.

15
Gumbo

Est-ce complètement compatible avec tous les navigateurs? Y a-t-il d'autres mises en garde?

Juste pour ajouter ceci, si vous développez sur un serveur local, cela 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", qui va casser puisque vous n'hébergez pas cette ressource localement.

Microsoft Internet Explorer semble être particulièrement sensible à cela, voyez cette question: Impossible de charger jQuery dans Internet Explorer sur localhost (WAMP)

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

La solution utilisée par HTML5Boilerplate consiste à appliquer un repli lorsque la ressource n'est pas chargée correctement, mais cela ne fonctionne que si vous incorporez une vérification:

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

J'ai posté cette réponse ici ainsi.

UPDATE: 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éconseiller les URL relatives au protocole, voir ici .

4
bg17aw

Je n'ai pas eu ces problèmes lors de l'utilisation de: //domain.com - mais vous devez ajouter les deux points au début. Yoast avait une bonne rédaction à ce sujet il y a quelque temps. Mais c'est perdu dans sa pile de billets de blog.

1
user1431784