Mengapa Anda menggunakan document.location.protocol alih-alih url biasa // yang diawali?

11

Misalnya Google Analytics menggunakan document.location.protocol di boilerplate untuk pelacakan:

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

dari pada

<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. sub-domain adalah argumen bisu karena https://www.google-analytics.com/ga.js berfungsi dengan baik.

Mengetahui Google ini kemungkinan besar bukanlah kekeliruan. Apakah ada masalah dengan browser tertentu yang tidak mendukung // protokol menghormati steno atau ada hal lain yang saya lewatkan?

EDIT: Ini tidak hanya berlaku untuk Google Analytics (contoh sub-domain yang berbeda). Hal yang sama muncul di halaman Font Loader API :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
Metalshark
sumber
Mungkin mendapatkan respons yang lebih baik dengan mengulangi pertanyaan Anda untuk bertanya tentang masalah teknis daripada mengapa Google melakukan sesuatu. Anda tidak akan mendapatkan jawaban nyata untuk yang kedua (kecuali jika kami melihat respons Googler lain di sini, yang akan lebih keren).
JasonBirch
Edit sedikit untuk membuatnya lebih agnostik. Ada saran lain?
Metalshark

Jawaban:

3

Memang, itu bukan pengawasan oleh Tim GA!
Pemuat GA memuat skrip, jadi itu tidak terpengaruh oleh bug unduhan ganda pada <link>atau @importuntuk stylesheet di IE7 / IE8.

Mereka menggunakan operator kondisional (ternary) document.location.protocol karena bug tepi-kasus di IE6 yang menyebabkan dialog keamanan muncul di bawah pengaturan keamanan tertentu ketika meminta dari subdomain bukan -sl , seperti dijelaskan oleh Paul Irish (yang bekerja bersama dengan pengembang utama javascript Google Analytics tentang masalah ini) di blognya: https://www.paulirish.com/2010/the-protocol-relative-url/ di mana saya kutip di bawah ini:
Gambar dialog keamanan keamanan IE6, sumber: http://paulirish.com/i/7b01.png

2011.01.23: Tapi ... bagaimana dengan menggunakan ini di cuplikan Google Analytics ?
Ya tentu saja, bukankah itu menyenangkan ... Jadi saya bekerja dengan pengembang utama javascript Google Analytics (Ya Tuhan, saya suka bekerja di google) untuk melihat apakah kami bisa melakukan ini ... ternyata kami tidak bisa. Ada bug edgecase di IE6 yang menyebabkan dialog meledak ... di bawah beberapa pengaturan keamanan (tidak yakin apakah mereka default) ketika meminta dari subdomain non-'ssl '. tangkapan layar di sini . Jadi jangan ragu untuk mengambil 40 byte dari potongan GA Anda jika Anda tidak peduli tentang IE6 .. jika tidak, Anda akan memerlukan operator ternary itu. `:)`
2011.12.24. Eric Law (dari tim IE) bertanya mengapa IE6 tidak berfungsi dengan baik ...
Alasan ini tidak bekerja di IE6 adalah bahwa server menggunakan SNI untuk menyimpulkan sertifikat apa yang akan dikembalikan. XP (dan karenanya IE6) tidak mendukung SNI di tumpukan HTTPS . Lihat detailnya .
GitaarLAB
sumber
1

Anda sudah menunjukkan perbedaan dalam hal Google Analytics, yaitu bahwa versi aman diaktifkan https://ssl.alih-alih http://www.. Sementara versi aman dari www dapat berfungsi, itu juga bisa berbeda dengan versi ssl:

  • Sertifikat berbeda untuk versi ssl dan versi www.
  • Kode berbeda pada setiap versi.
  • Cookies berbeda ditetapkan, khusus untuk domain SSL.

Saya tidak tahu apakah ini berlaku untuk Google. Dari pandangan sekilas kode itu tampak sama.

DisgruntledGoat
sumber
Contoh lain adalah pemuat font code.google.com/apis/webfonts/docs/webfont_loader.html di sini tidak ada perbedaan dalam domain. Setiap contoh boilerplate dari kodenya mengikuti pola yang sama.
Metalshark
Dalam hal ini, mereka menggunakan domain yang sama. Mungkin ada beberapa browser kuno yang tidak mengenali //protokolnya?
DisgruntledGoat
Itulah pemikirannya, tetapi yang mana, yang lebih penting mana yang juga mendukung font web? Apakah itu memungkinkan perilaku yang lebih paralel (gaya fisika kuantum, dengan membaca proto itu mengubah keadaan browser)? Saya sudah benar-benar diuji dan saya belum melihat logika ...
Metalshark
0

Jawaban Stack Overflow ini memberikan beberapa poin bagus.

Penting untuk secara eksplisit menentukan protokol sehingga aset target dimuat dengan benar dalam dokumen yang dibuka dari drive lokal ( file:) atau saat menggunakan "iframe magic" ( about:).

Andrew Ashbacher
sumber
0

//www.google-analytics.com/ga.jsbukan URL per standarnya, karena tidak memiliki skema, yang wajib. Ini berfungsi dan digunakan, tetapi tetap tidak sesuai dengan standar URL.

Lihat RFC3986 §3:

Komponen skema dan jalur diperlukan, meskipun jalur mungkin kosong (tidak ada karakter). Ketika otoritas hadir, jalan harus kosong atau dimulai dengan karakter garis miring ("/"). Ketika otoritas tidak ada, jalan tidak dapat dimulai dengan dua karakter garis miring ("//").

Patrick Mevzek
sumber
Skema tidak diperlukan jika sama di browser.
Metalshark
Baca RFC tolong: skema ini wajib di semua URL. Ini terlepas dari apa yang terjadi pada pekerjaan, standar hanya mengatakan sebaliknya dan ada penyimpangan di alam liar.
Patrick Mevzek