Czy poprawne jest zastąpienie http:// przez // w a?

Mam następujący element:

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

W tym przypadku witryna jest HTTPS, ale witryna może być również po prostu HTTP. (Plik JS Znajduje się w innej domenie.) Zastanawiam się, czy dla wygody należy wykonać następujące czynności:

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

Zastanawiam się czy poprawne jest usunięcie http: Czy https:?

Wygląda na to, że działa wszędzie, gdzie testowałem, ale czy są jakieś przypadki, w których nie działa?

Author: unor, 2009-02-15

13 answers

Względny adres URL bez schematu (http: lub https:) jest prawidłowy, zgodnie z RFC 3986: "Uniform Resource Identifier (URI): Generic Syntax", sekcja 4.2. Jeśli klient się tym dławi, to jest to jego wina, ponieważ nie jest zgodny ze składnią URI określoną w RFC.

Twój przykład jest poprawny i powinien działać. Sam korzystałem z tej względnej metody URL na stronach o dużym natężeniu ruchu i nie miałem żadnych skarg. Ponadto testujemy nasze strony w Firefoksie, Safari, IE6, IE7 i Opera. Wszystkie te przeglądarki rozumieją ten format adresu URL.

 375
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 18:52:34

Jest gwarantowana praca w każdej przeglądarce głównego nurtu (nie biorę pod uwagę przeglądarek z mniejszym niż 0,05% udziałem w rynku). Heck, to działa w Internet Explorer 3.0.

RFC 3986 definiuje URI jako składające się z następujących części:

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

Definiując względne Uri ( sekcja 5.2), możesz pominąć dowolną z tych sekcji, zawsze zaczynając od lewej. W pseudo-kodzie wygląda to tak:

 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;

URI, które opisujesz, nie jest schematem względny URI.

 147
Author: Andrew Moore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-06 19:25:38
Czy są jakieś przypadki, w których to nie działa?

Jeśli Strona nadrzędna została załadowana z file://, to prawdopodobnie nie działa(spróbuje uzyskać file://cdn.example.com/js_file.js, co oczywiście można również podać lokalnie).

 76
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 08:27:19

Wiele osób nazywa to względnym adresem URL protokołu.

Powoduje podwójne pobieranie plików CSS w IE 7 & 8.

 40
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-04 15:58:05

Tutaj powielam odpowiedź w ukryte cechy HTML :

Użycie bezwzględnego niezależnego od protokołu Ścieżka:

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

Jeśli przeglądarka przegląda stronę w SSL przez HTTPS, wtedy zażąda zasób z protokołem https, w przeciwnym razie zażąda go za pomocą HTTP.

To zapobiega tej okropnej " tej stronie Zawiera zarówno bezpieczne, jak i niezabezpieczone Items " komunikat o błędzie w IE, utrzymanie wszystkie Twoje żądania dotyczące aktywów w ramach to samo protokół.

Uwaga: w przypadku stosowania na <link> lub @ import dla arkusza stylów, IE7 i IE8 pobierz plik dwa razy . Wszystkie inne zastosowania są jednak w porządku.

 22
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:22

Jest całkowicie słuszne, aby pominąć protokół. Specyfikacja URL była o tym bardzo jasna od lat, a ja jeszcze nie znalazłem przeglądarki, która tego nie rozumie. Nie wiem, dlaczego ta technika nie jest lepiej znana; jest to idealne rozwiązanie ciernistego problemu przekraczania granic HTTP / HTTPS. Więcej tutaj: Http-https przejścia i względne adresy URL

 16
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 08:54:16
Czy są jakieś przypadki, w których to nie działa?

Dorzuć to do miksu, jeśli rozwijasz się na lokalnym serwerze, może to nie zadziałać. Musisz określić schemat, w przeciwnym razie przeglądarka może założyć, że src="//cdn.example.com/js_file.js" to src="file://cdn.example.com/js_file.js", co się zepsuje, ponieważ nie hostujesz tego zasobu lokalnie.

[5]}Microsoft Internet Explorer wydaje się być szczególnie wrażliwy na to pytanie, zobacz to pytanie: nie można załadować jQuery w Internet Explorer na localhost (WAMP)

Prawdopodobnie zawsze starałbyś się znaleźć rozwiązanie, które działa na wszystkich Twoich środowiskach z jak najmniejszą ilością potrzebnych modyfikacji.

Rozwiązaniem używanym przez HTML5Boilerplate {[12] } jest posiadanie awaryjnego powrotu, gdy zasób nie jest ładowany poprawnie, ale działa to tylko wtedy, gdy włączysz sprawdzenie:

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

UPDATE: HTML5Boilerplate używa teraz <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js Po podjęciu decyzji o wycofaniu adresów URL związanych z protokołem, zobacz [tutaj] [3].

 5
Author: bg17aw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:56

Po odwołaniu gnud, RFC 3986 sekcja 5.2 mówi:

Jeśli element programu jest zdefiniowany, wskazując, że odniesienie zaczyna się od nazwy schematu, następnie Referencja jest interpretowana jako absolutny URI i koniec. W Przeciwnym Razie, schemat Uri odniesienia jest dziedziczona z bazowego komponentu Uri.

Więc // jest poprawne: -)

 3
Author: Pablo Torrecilla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 07:46:42

Tak, jest to udokumentowane w RFC 3986 , Sekcja 5.2:

(edit: Oops, moje odniesienie do RFC było nieaktualne).

 2
Author: gnud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-04 15:55:51

[1]}jest rzeczywiście poprawna, jak stwierdziły inne odpowiedzi. Należy jednak pamiętać, że niektóre Web crawlery uruchomią dla nich 404, żądając ich na serwerze, jak gdyby lokalny adres URL. (Pomijają podwójny Ukośnik i traktują go jako pojedynczy ukośnik).

Możesz ustawić regułę na serwerze, aby je złapać i przekierować.

Na przykład, z Nginx, możesz dodać coś w stylu:
location ~* /(?<redirect_domain>((([a-z]|[0-9]|\-)+)\.)+([a-z])+)/(?<redirect_path>.*) {
  return 301 $scheme:/$redirect_domain/$redirect_path;
}

Pamiętaj jednak, że jeśli używasz okresów w Uri, musisz zwiększ swoistość lub skończy się przekierowaniem tych stron do nieistniejących domen.

Jest to również dość masywny regex, który działa dla każdego zapytania - moim zdaniem warto karać niezgodne przeglądarki 404 za (niewielki) hit wydajności w większości zgodnych przeglądarek.

 2
Author: jlovison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 11:33:55

Widzimy 404 błędy w naszych logach podczas korzystania z //somedomain.com jako odniesienia do plików JS.

Odniesienia, które powodują, że 404 wychodzą tak: ref:

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

404 zapytanie:

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

Ponieważ pojawiają się one regularnie w logach naszych serwerów internetowych, można śmiało powiedzieć, że: wszystkie przeglądarki i boty nie honorują sekcji 4.2 RFC 3986. Najbezpieczniejszym zakładem jest włączenie protokołu w miarę możliwości.

 2
Author: Lemiarty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 14:19:45

Wzór, który widzę na html5-boilerplate to:

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

Działa płynnie na różnych systemach, takich jak http, https, file.

 1
Author: neurite,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 07:46:14

Jako że twoim przykładem jest połączenie z zewnętrzną domeną, jeśli używasz HTTPS, powinieneś sprawdzić, czy zewnętrzna domena jest również skonfigurowana dla SSL. W przeciwnym razie użytkownicy mogą zobaczyć błędy SSL i/lub błędy 404 (np. starsze wersje Plesk przechowują HTTP i HTTPS w oddzielnych folderach). Dla CDN nie powinno to być problemem, ale dla każdej innej strony internetowej może być.

Na marginesie, testowane podczas aktualizacji starej strony internetowej, a także działa w url = część odświeżania META.

 0
Author: user2246924,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 23:27:41