Dlaczego miałbyś używać document.location.protocol zamiast zwykłego // adresu URL z prefiksem?

12

Na przykład Google Analytics korzysta z document.location.protocol na płycie głównej do śledzenia:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

zamiast

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = '//www.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

The ssl. subdomena jest niemym argumentem, ponieważ https://www.google-analytics.com/ga.js działa doskonale.

Znajomość Google najprawdopodobniej nie jest niedopatrzeniem. Czy występuje problem z niektórymi przeglądarkami, które nie obsługują protokołu // honorującego stenografię, czy jest coś jeszcze, czego mi brakuje?

EDYCJA: Dotyczy to nie tylko Google Analytics (inny przykład subdomeny). To samo pojawia się na stronie API modułu ładującego czcionki :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
Metalshark
źródło
Może uzyskać lepszą odpowiedź, przeformułowując pytanie, aby zadać pytanie o problem techniczny, a nie dlaczego Google coś robi. Nie dostaniesz prawdziwej odpowiedzi na drugie (chyba że zobaczymy tutaj kolejną odpowiedź Googlera, co byłoby fajne).
JasonBirch
Nieznaczna edycja, aby uczynić ją bardziej agnostyczną. Jakieś inne sugestie?
Metalshark,

Odpowiedzi:

3

Rzeczywiście, nie był to niedopatrzenie zespołu GA!
Moduł ładujący GA ładuje skrypt, więc nie ma na niego wpływu błąd podwójnego pobierania na a <link>lub @importdla arkuszy stylów w IE7 / IE8.

Używają operatora warunkowego (trójskładnikowego) z document.location.protocol powodu błędu krawędzi w IE6, który powoduje pojawienie się okna dialogowego bezpieczeństwa przy określonych ustawieniach bezpieczeństwa podczas żądania z subdomeny innej niż „SSL” , jak wyjaśnił Paul Irish (który pracował wraz z wiodącym deweloperem javascript Google Analytics w tej sprawie) na swoim blogu: https://www.paulirish.com/2010/the-protocol-relative-url/, z którego cytuję poniżej:
Obraz okna dialogowego zabezpieczeń IE6, źródło: http://paulirish.com/i/7b01.png

2011.01.23: Ale ... a co z użyciem tego we fragmencie Google Analytics ?
Tak, oczywiście, czy to nie byłoby miłe ... Więc pracowałem z głównym programistą JavaScript w Google Analytics (Boże, uwielbiam pracować w Google), aby zobaczyć, czy możemy to zrobić ... okazuje się, że nie możemy. W IE6 jest błąd edgecase, który powoduje wysadzenie okna dialogowego ... przy niektórych ustawieniach bezpieczeństwa (nie jestem pewien, czy są one domyślne) podczas żądania z subdomeny innej niż „ssl ”. zrzut ekranu tutaj . Więc nie krępuj się usunąć 40 bajtów z fragmentu GA, jeśli nie przejmujesz się IE6 .. w przeciwnym razie będziesz potrzebował tego trójskładnikowego operatora. `:)`
2011.12.24. Eric Law (z zespołu IE) zastanawia się, dlaczego IE6 nie gra dobrze GA ...
To nie działa w IE6, ponieważ serwer używa SNI, aby wywnioskować, który certyfikat ma zostać zwrócony. XP (a zatem IE6) nie obsługuje SNI w stosie HTTPS . Zobacz szczegóły .
GitaarLAB
źródło
1

Wskazałeś już różnicę w przypadku Google Analytics, a mianowicie, że bezpieczna wersja jest włączona https://ssl.zamiast http://www.. Chociaż bezpieczna wersja strony internetowej może działać, może również różnić się od wersji ssl:

  • Różne certyfikaty dla wersji ssl i wersji www.
  • Inny kod dla każdej wersji.
  • Zestaw różnych plików cookie, specyficzny dla domeny SSL.

Nie wiem jednak, czy którekolwiek z nich dotyczą Google. Na pierwszy rzut oka kod wyglądał tak samo.

DisgruntledGoat
źródło
Innym przykładem może być moduł ładujący czcionki code.google.com/apis/webfonts/docs/webfont_loader.html tutaj nie ma różnicy w domenie. Każdy przykładowy kod ich kodu jest zgodny z tym samym wzorem.
Metalshark,
W takim przypadku używają tej samej domeny. Może istnieją archaiczne przeglądarki, które nie rozpoznają //protokołu?
DisgruntledGoat
Takie było myślenie, ale które, a co ważniejsze, które obsługują również czcionkę internetową? Czy pozwala na bardziej równoległe zachowanie (styl fizyki kwantowej, po odczytaniu proto zmienia stan przeglądarki)? Dokładnie przetestowałem i jeszcze nie widzę logiki ...
Metalshark
0

Ta odpowiedź na przepełnienie stosu zawiera kilka dobrych punktów.

Ważne byłoby jawne określenie protokołu, aby zasób docelowy został poprawnie załadowany w dokumencie otwartym z dysku lokalnego ( file:) lub podczas korzystania z „magii iframe” ( about:).

Andrew Ashbacher
źródło
0

//www.google-analytics.com/ga.jsnie jest adresem URL zgodnie ze swoim standardem, ponieważ nie ma schematu, który jest obowiązkowy. Działa i jest używany, ale pozostaje niezgodny ze standardem URL.

Patrz RFC3986 §3:

Wymagane są elementy schematu i ścieżki, choć ścieżka może być pusta (bez znaków). Gdy uprawnienia są obecne, ścieżka musi być pusta lub zaczynać się od ukośnika („/”). Gdy autorytet nie jest obecny, ścieżka nie może rozpoczynać się od dwóch znaków ukośnika („//”).

Patrick Mevzek
źródło
Schemat nie jest wymagany, jeśli jest taki sam w przeglądarkach.
Metalshark
Proszę przeczytać RFC: schemat jest obowiązkowy we wszystkich adresach URL. Jest to niezależne od tego, co się dzieje, norma mówi po prostu inaczej i istnieją odchylenia na wolności.
Patrick Mevzek