Чому б ви використовували document.location.protocol замість звичайних // префіксованих URL-адрес?


12

Наприклад, Google Analytics використовує document.location.protocol на панелі котлів для відстеження:

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

замість

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

Ssl. субдомен - це приглушений аргумент, оскільки https://www.google-analytics.com/ga.js прекрасно працює.

Знання Google це, швидше за все, не є недоглядом. Чи є проблема з певними веб-переглядачами, які не підтримують // протокол вшанування стенограми, або щось інше мені не вистачає?

EDIT: Це не стосується лише Google Analytics (інший приклад піддомену). Те саме відбувається на сторінці API шрифту :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';

Ви можете отримати кращу відповідь, перефразовуючи ваше запитання, щоб задати технічну проблему, а не чому Google щось робить. Ви не збираєтесь отримати справжню відповідь на другий (якщо ми не побачимо тут ще одну відповідь Googler, що було б круто).
JasonBirch

Трохи редагуйте, намагаючись зробити це більш агностичним. Будь-які інші пропозиції?
Metalshark

Відповіді:


3

Дійсно, це був не нагляд з боку команди GA!
Завантажувач GA завантажує сценарій, тому помилка подвійного завантаження на <link>або @importдля таблиць стилів в IE7 / IE8 не впливає .

Вони використовують умовного (потрійного) оператора document.location.protocol через помилку в крайньому випадку в IE6, яка викликає діалогове вікно безпеки під певними налаштуваннями безпеки при запиті з піддомену non-'ssl ' , як пояснив Пол Ірліш (який працював разом із провідним розробником JavaScript Google щодо цього питання) у своєму блозі: https://www.paulirish.com/2010/the-protocol-relative-url/, з якого я цитую нижче:
Діалогове зображення безпеки безпеки IE6, джерело: http://paulirish.com/i/7b01.png

2011.01.23: Але ... а як бути з цим використанням у фрагменті Google Analytics ?
Так, звичайно, хіба це не було б добре ... Тож я працював із головним розробником JavaScript Google Analytics (Боже, я люблю працювати в google), щоб побачити, чи можемо ми це зробити ... виявляється, ми не можемо. У IE6 є помилка, що спричиняє обробку діалогового вікна ... під деякими налаштуваннями безпеки (не впевнені, що вони є за замовчуванням) під час запиту від субдомену не'ssl '. скріншот тут . Тому сміливо знімайте 40 байт свого фрагмента GA, якщо вам не байдуже IE6 .. інакше вам знадобиться цей потрійний оператор. `:)`
2011.12.24. Ерік Лоу (від команди IE) звучить, чому IE6 не грає добре GA ...
Причина цього не працює в IE6 в тому, що сервер використовує SNI для виведення сертифіката для повернення. XP (і, отже, IE6) не підтримує SNI в стеку HTTPS . Детальніше дивіться .


1

Ви вже вказали на різницю у випадку з Google Analytics, а саме в тому, що захищена версія не https://ssl.замість http://www.. Хоча захищена версія www може працювати, вона також може відрізнятися від версії ssl:

  • Різні сертифікати для версії ssl та www.
  • Різний код у кожній версії.
  • Набір різних файлів cookie, характерних для домену SSL.

Я не знаю, чи стосується будь-якого з них до Google. З першого погляду код виглядав так само.


Іншим прикладом може бути завантажувач шрифтів code.google.com/apis/webfonts/docs/webfont_loader.html, тут немає різниці в домені. Кожен приклад кодового коду їх коду дотримується тієї ж схеми.
Metalshark

У цьому випадку вони використовують один і той же домен. Можливо, є якісь архаїчні браузери, які не розпізнають //протокол?
НезадоволенеГотуйте

Це було мислення, але які, головне, ті, які також підтримують веб-шрифт? Чи дозволяє це більш паралельне поведінку (квантова фізика в стилі, читаючи протоколь, це змінює стан браузера)? Я ретельно перевірив і ще не бачу логіки ...
Metalshark

0

Ця відповідь про переповнення стека дає хороші моменти.

Було б важливо чітко вказати протокол, щоб цільовий актив правильно завантажився в документі, відкритому з локального диска ( file:) або при використанні "iframe magic" ( about:).


0

//www.google-analytics.com/ga.jsне є URL-адресою за своїм стандартом, оскільки в ній відсутня схема, яка є обов'язковою. Він працює і використовується, але залишається невідповідним стандарту URL.

Див. Пункт RFC3986 §3:

Схема та компоненти контуру потрібні, хоча шлях може бути порожнім (символів немає). Коли авторитет присутній, шлях повинен бути або порожнім, або починатися з косого ("/") символу. Якщо повноважень немає, шлях не може починатися двома символами похилої риси ("//").


Схема не потрібна там, де вона однакова в браузерах.
Metalshark

Прочитайте, будь ласка, RFC: схема є обов'язковою для всіх URL-адрес. Це незалежно від того, що трапляється на роботі, стандарт просто говорить інакше, і в дикій природі є відхилення.
Патрік Мевзек
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.