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

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 .


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.


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:).


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 („//”).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.