Kann ich alle meine http: // Links auf nur // ändern?

240

Dave Ward sagt:

Es ist nicht gerade leicht zu lesen, aber Abschnitt 4.2 von RFC 3986 enthält vollständig qualifizierte URLs, bei denen das Protokoll (HTTP oder HTTPS) insgesamt weggelassen wird. Wenn das Protokoll einer URL weggelassen wird, verwendet der Browser stattdessen das Protokoll des zugrunde liegenden Dokuments.

Einfach ausgedrückt, ermöglichen diese "protokolllosen" URLs, dass eine solche Referenz in jedem Browser funktioniert, in dem Sie sie ausprobieren:

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

Auf den ersten Blick sieht es seltsam aus, aber diese "protokolllose" URL ist der beste Weg, um auf Inhalte von Drittanbietern zu verweisen, die sowohl über HTTP als auch über HTTPS verfügbar sind.

Dies würde sicherlich eine Reihe von Fehlern mit gemischtem Inhalt lösen, die auf HTTP-Seiten auftreten - vorausgesetzt, unsere Assets sind sowohl über HTTP als auch über HTTPS verfügbar.

Ist das vollständig browserübergreifend kompatibel? Gibt es noch andere Einschränkungen?

ein bezahlter Nerd
quelle
Ich habe vor einiger Zeit im IE-Blog über diese Technik gelesen. Aber als ich es versuchte, funktionierte es nicht ganz gut. Wenn meine Website mit HTTPS bereitgestellt wurde, verwendete der Browser (Chrome) weiterhin HTTP für protokolllose URLs.
Christopher Ramírez
10
WARNUNG: Denken Sie daran, NIEMALS schemenlose URIs in HTTP 3xx-Weiterleitungen zu verwenden. HTTP-Header sind mit diesem URL-Format nicht kompatibel. Wenn Sie je nach Schema umleiten müssen, verwenden Sie mod_rewrite oder ähnliches.
user2596282
1
@ user2596282 Das Experimentieren in modernen Versionen von Chrome und Firefox stimmt nicht mit Ihnen überein, ebenso wie die (noch im Entwurf befindliche) Revision von HTTP 1.1. Spezifikation, die von der HTTPbis-Arbeitsgruppe definiert wurde (siehe svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/… ). Vielleicht trifft das, was Sie sagen, jedoch auf einige Browser zu; Kennen Sie bestimmte, die bei protokollbezogenen URLs in Standortheadern fehlschlagen?
Mark Amery
Gleiche Frage mit einigen guten Antworten: Absolute URLs, die das Protokoll (Schema) weglassen, um die aktuelle Seite
Álvaro González
Verwenden Sie sie nicht, sie sind hässlich und überflüssig.
IllidanS4 will Monica

Antworten:

204

Ich habe es vor der Veröffentlichung gründlich getestet. Von allen Browsern, die zum Testen auf Browsershots verfügbar sind , konnte ich nur einen finden, der die relative URL des Protokolls nicht korrekt handhabte: einen obskuren * nix-Browser namens Dillo .

Es gibt zwei Nachteile, zu denen ich Feedback erhalten habe:

  1. Protokolllose URLs funktionieren möglicherweise nicht wie erwartet, wenn Sie eine lokale Datei in Ihrem Browser "öffnen", da das Basisprotokoll der Seite file: /// ist. Insbesondere, wenn Sie die protokolllose URL für eine externe Ressource wie ein von CDN gehostetes Asset verwenden. Die Verwendung eines lokalen Webservers wie Apache oder IIS zum Testen anhand von http: // localhost- Adressen funktioniert jedoch einwandfrei.
  2. Anscheinend gibt es mindestens eine iPhone-Feed-Reader-App, die die protokolllosen URLs nicht korrekt verarbeitet. Mir ist nicht bekannt, wer das Problem hat oder wie beliebt es ist. Das Hosten einer JavaScript-Datei ist kein großes Problem, da RSS-Reader JavaScript-Inhalte normalerweise sowieso ignorieren. Es kann jedoch ein Problem sein, wenn Sie diese URLs für Medien wie Bilder in Inhalten verwenden, die über RSS syndiziert werden müssen (obwohl diese App mit einem einzigen Leser auf einer einzigen Plattform wahrscheinlich nur eine sehr geringe Anzahl von Lesern ausmacht).
Dave Ward
quelle
33
Während IE7 / 8 protokollbezogene URLs (auch als schemenlose URIs bezeichnet) in den meisten Fällen gut verarbeitet, werden Stylesheets, die mit solchen URLs angegeben werden, zweimal heruntergeladen . (So ​​sagt Steve Souders )
Lucasrizoli
3
Ich stelle fest, dass IE6 versucht, den URI in einen relativen zu konvertieren (dh einen der führenden Schrägstriche zu entfernen). Dies ist in einem linkElement. Wenn Sie beispielsweise //fonts.googleapis.com/css?family=Rokkitt:400,700angeben, versucht IE6 zu laden http://mysite.com/fonts.googleapis.com/css/<...>. Nicht so gut!
CBono
2
Ich habe in meinen Protokollen Instanzen von scheinbar Web-Spider-Robotern (Quelle unbekannt) gefunden, die versuchen, die protokolllosen Links zu verwenden und sie auch nicht richtig zu behandeln.
Kzqai
3
Ich habe viel davon in meinen Protokollen gesehen, unabhängig von protokolllosen URLs. Viele dieser Spinnen sind einfach unglaublich schlecht geschrieben.
Dave Ward
11
Es ist wichtig zu verstehen , dass diese URLs sind nicht protokoll weniger , aber Protokoll- relativ . Sie beziehen ihr Protokoll aus ihrem Kontext, und da ihnen ein Kontext fehlt, verhalten sie sich in den meisten Browsern wie Datei-URLs, was effektiv bedeutet, dass sie nicht den beabsichtigten Inhalt laden. Sie funktionieren zwar, wenn sie über http bereitgestellt werden, aber wenn Sie die Seite speichern und genau denselben HTML-Code aus einer lokalen Datei laden, funktionieren sie nicht, da der Kontext unterschiedlich ist. Der einzige Kontext, in dem Sie sie verwenden sollten, ist http vs https.
Synchro
37

Die Frage, ob man alle ihre Links so ändern könnte , dass sie protokollbezogen sind, kann strittig sein, wenn man bedenkt, ob man dies tun sollte . Laut Paul Irish :

2014.12.17: Jetzt, da SSL für alle empfohlen wird und keine Leistungsbedenken hat, ist diese Technik jetzt ein Anti-Pattern. Wenn das von Ihnen benötigte Asset über SSL verfügbar ist, verwenden Sie immer das Asset https: // .

Ohad Schneider
quelle
Ich dachte genau das gleiche. Was bringt es, ein externes Asset über http herunterzuladen, wenn es auch über https verfügbar ist - selbst wenn die Hauptwebsite http verwendet (was nicht der Fall sein sollte, aber das ist ein anderes Thema).
joonas.fi
1
@ joonas.fi Das einzige, was ich mir vorstellen kann, ist, gemischte HTTP / HTTPS-Warnungen zu vermeiden, die von einigen Browsern generiert werden könnten
Ohad Schneider
3
@ Ohad_Schneider-Warnungen werden nur ausgelöst, wenn das Dokument über sicher (https), aber Assets über unsicher (http) geladen wird. Ich habe vorgeschlagen, dass Sie Assets immer über sicher laden können, auch wenn das Dokument über unsicher geladen ist. Es gibt keine Warnung und keinen Grund, nicht sicher zu verwenden, wodurch die gesamte "protokollbezogene URL" unnötig wird.
joonas.fi
1
@Ohad_Schneider oh sorry, ich glaube ich habe falsch interpretiert was du gesagt hast. Das Laden von Assets über https, wenn Ihr Dokument über http ist, sollte keine Warnungen erzeugen. Das Laden von Assets über http, wenn Ihr Dokument über https ist, funktioniert jedoch (und ist wahrscheinlich standardmäßig blockiert, zumindest in Chrome). Haben Sie sich auf den Fall bezogen, in dem Sie Ihre Website über https bereitstellen und externe Assets nur unter http verfügbar sind? Ja, das könnte ein Problem sein, aber ich glaube nicht, dass es einen ernsthaften Drittanbieter-Service gibt, der seine Inhalte nicht über https bereitstellt, sonst sollten sie sowieso aus dem Geschäft gehen. :)
joonas.fi
@ joonas.fi Wut? O_o Wenn jemand über HTTPSed Site (then) -Protokoll-relative URLs verfügt, hilft dies nicht, das Abrufen von Assets von Drittanbietern über HTTP zu lösen - auf keinen Fall. Und auf jeden Fall ist es besser, nicht das sauber-grüne SSL-Logo auf Ihrer HTTPS-Seite zu haben, als es wieder an HTTP zurückzugeben, nur weil Dritte HTTPS noch nicht unterstützen.
Poige
30

Wenn Sie zum Laden von Stylesheets protokolllose URLs verwenden, werden diese von IE 7 und 8 zweimal heruntergeladen: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/

Dies ist für CSS zu vermeiden, wenn Sie eine gute Leistung wünschen.

Tim Beadle
quelle
5
Dies ist jedoch immer weniger ein Grund, die Verwendung schemenloser URLs zu vermeiden, da der Marktanteil von IE 7 und 8 abnimmt.
Simon Lieschke
15

Ja, Netzwerkpfadreferenzen wurden bereits in RFC 1808 angegeben und sollten mit allen Browsern funktionieren.

Gumbo
quelle
11
Es wird sogar empfohlen und im HTML5-Code verwendet: html5boilerplate.com
Felipe Lima
1
mit Ja, Sie antworten nicht mit Ja auf "Gibt es noch andere Einschränkungen?" ? ;)
Caspar Kleijne
2
@Caspar Kleijne: Ich habe das Ja mit dem Rest des Satzes erklärt.
Gumbo
1
Casper, Gumbo beantwortete tatsächlich die beiden gestellten Fragen: "Ist das vollständig browserübergreifend kompatibel? Gibt es noch weitere Einschränkungen?" Ja ist die Antwort auf die erste Frage.
Darren Griffith
4

Ist das vollständig browserübergreifend kompatibel? Gibt es noch andere Einschränkungen?

Nur um dies in den Mix zu werfen, wenn Sie auf einem lokalen Server entwickeln, funktioniert es möglicherweise nicht. Sie benötigen ein Programm angeben, sonst wird der Browser davon ausgehen kann , dass src="//cdn.example.com/js_file.js"ist src="file://cdn.example.com/js_file.js", was zu brechen , da Sie nicht auf diese Ressource lokal Hosting.

Microsoft Internet Explorer scheint hierfür besonders sensibel zu sein. Siehe folgende Frage: jQuery kann nicht in Internet Explorer auf localhost (WAMP) geladen werden.

Sie würden wahrscheinlich immer versuchen, eine Lösung zu finden, die in all Ihren Umgebungen mit den geringsten erforderlichen Änderungen funktioniert.

Die von HTML5Boilerplate verwendete Lösung besteht darin, einen Fallback zu haben, wenn die Ressource nicht korrekt geladen ist. Dies funktioniert jedoch nur, wenn Sie eine Prüfung einbinden :

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

Ich habe diese Antwort auch hier gepostet .

UPDATE: HTML5Boilerplate wird jetzt verwendet, <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">nachdem entschieden wurde, protokollbezogene URLs zu verwerfen (siehe hier) .

bg17aw
quelle
1

Ich hatte diese Probleme bei der Verwendung von: //domain.com nicht - aber Sie müssen den Doppelpunkt am Anfang hinzufügen. Yoast hatte vor einiger Zeit einen guten Bericht darüber. Aber es ist in seinem Stapel von Blog-Posts verloren.

user1431784
quelle
Down-Voting für die Nichtangabe, wo das zusätzliche: nützlich ist. Überall, wo ich versehentlich das ":" verlassen habe, wurde die Verbindung
rob