web-dev-qa-db-ja.com

//接頭辞付きの単純なURLではなくdocument.location.protocolを使用するのはなぜですか?

たとえば、Googleアナリティクスはボイラープレートで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アナリティクスだけに適用されるわけではありません(異なるサブドメインの例)。同じことが Font Loader APIページ に表示されます:

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

確かに、GAチームによる監視ではないでした。
GAローダーはスクリプトをロードするため、IE7/IE8のスタイルシートの<link>または@importのダブルダウンロードのバグの影響を受けません。

document.location.protocolで条件付き(3項)演算子を使用します非 'ssl'サブドメインからのリクエスト時に特定のセキュリティ設定でセキュリティダイアログがポップアップするIE6のエッジケースバグのため
IE6 security security-dialog image, source: http://paulirish.com/i/7b01.png
彼のブログでPaul Irish(Googleアナリティクスのjavascriptの主任開発者と協力して)の説明: https://www.paulirish.com/2010/the-protocol-relative -url / 引用元:

2011.01.23:しかし... ... Google Analyticsスニペットでこれを使用
もちろん、それはいいことではないでしょう...だから私はGoogleアナリティクスのjavascriptリード開発者(神、私はgoogleで働くのが大好きです)と協力して、これができるかどうかを確認しました...できないことがわかりました。 IE6には、一部のセキュリティ設定(デフォルトではないかどうか不明)で非 'ssl'サブドメインから要求するときにダイアログが爆発するエッジケースバグがあります。 ここのスクリーンショット 。 IE6を気にしない場合は、GAスニペットから40バイトを自由に取り除いてください。そうでなければ、その3項演算子が必要になります。 `:)`
2011.12.24。 Eric Law(IEチーム)が、IE6がうまく機能しない理由について話します...
IE6でこれが機能しない理由は、サーバーがSNIを使用して、返す証明書を推測しているためです。 XP(したがってIE6)はHTTPSスタックでSNIをサポートしません詳細を参照
3
GitaarLAB

少なくともIEに1つの問題があります。二重ダウンロードが発生するためです。 http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download /

4
AlfonsoML

Googleアナリティクスの場合の違い、つまりセキュアバージョンがhttps://ssl.ではなくhttp://www.にあることを既に指摘しました。 wwwの安全なバージョンが機能する場合もありますが、sslバージョンとは異なる場合もあります。

  • Sslバージョンとwwwバージョンの異なる証明書。
  • バージョンごとに異なるコード。
  • SSLドメインに固有の異なるCookieセット。

ただし、これらのいずれかがGoogleに適用されるかどうかはわかりません。一見すると、コードは同じように見えました。

1
DisgruntledGoat

//www.google-analytics.com/ga.jsは、必須のスキームがないため、その規格ごとのURLではありません。機能し、使用されますが、URL標準に準拠していません。

RFC3986§3を参照してください。

スキームとパスのコンポーネントは必須ですが、パスは空(文字なし)でもかまいません。権限が存在する場合、パスは空であるか、スラッシュ(「/」)文字で始まる必要があります。権限が存在しない場合、パスを2つのスラッシュ文字( "//")で始めることはできません。

0
Patrick Mevzek

このスタックオーバーフロー answer は、いくつかの良い点になります。

プロトコルを明示的に指定して、ターゲットドライブがローカルドライブ(file:)から開かれたドキュメント内に正しく読み込まれるようにするか、「iframe magic」(about:)を使用する場合に重要です。

0