<script src =“ http://…”>でhttp://を//に置き換えることは有効ですか?


458

私は次の要素を持っています:

<script type="text/javascript" src="https://cdn.example.com/js_file.js"></script>

この場合、サイトはHTTPSですが、サイトは単なるHTTPの場合もあります。(JSファイルは別のドメインにあります。)便宜上、次の操作を行うことが有効かどうか疑問に思っています。

<script type="text/javascript" src="//cdn.example.com/js_file.js"></script>

http:またはを削除することが有効かどうか疑問に思っていhttps:ますか?

私がテストしたすべての場所で動作するようですが、動作しない場合はありますか?


2
「どこでも機能するようだ」を画像、iframe、link-relsなどに一般化できますか?もしそうなら、これは興味深いものです。
12345

うん、それはURIを必要とするあらゆる場所で機能するはずです:画像、リンクなど。これが使用されているのを見ることはまれですが、それは完全に有効です。
ジェフ

1
インスタント投票の人たちとはどうですか?質問が悪いということではなく、私はただ興味があります。しかし、クリスの最初の評判は影響力を持っているに違いない。
Frederik Wordenskjold、2010年

13
@Frederik:それは、ほとんどの人が知らないように見える魅力的で便利なトリックだからです。
SLaks

8
@フレデリク:何?
SLaks

回答:


387

スキームなしの相対URL(http:またはhttps :)は、RFC 3986: "Uniform Resource Identifier(URI):Generic Syntax"、Section 4.2に従って有効です。クライアントがそれをチョークする場合、それらはRFCで指定されたURI構文に準拠していないため、クライアントの責任です。

あなたの例は有効であり、うまくいくはずです。トラフィック量の多いサイトでは、この相対URLメソッドを自分で使用し、苦情はありませんでした。また、Firefox、Safari、IE6、IE7、Operaでサイトをテストします。これらのブラウザはすべて、そのURL形式を理解しています。


30
「クライアントがそれをチョークする場合、それらはRFCで指定されたURI構文に準拠していないため、クライアントの責任です。」-これは興味深い質問だと思います-しかし、クライアントが "仕様"に従うかどうかは、Webアプリで行うのが賢明かどうかの良い基準にはなりません。
マットハウエル

6
この手法はあまり知られていないようですが、すべてのWebブラウザーでサポートされています。それだけでうまくいきます。
Ned Batchelder、

8
なぜグーグルが分析にこれを使わないのかしら。それらはdocument.location.protocolメソッドを使用します。
ダリル・ハイン

5
@Darryl Heinスキームだけでなく、URLも変更するため、googleはdocument.location.protocolメソッドを使用すると思います。彼らはに行くSSL.google-analytics.com文書がhttpsスキームを使用している場合。
Nick Meldrum、2011

18
Windows XPネットワークスタックはSNIをサポートしていないため、googleはこれを使用しません。ここを参照してください:blogs.msdn.com/b/ieinternals/archive/2009/12/07/…。したがって、GoogleアナリティクススクリプトをIE6のhttps経由でロードできるようにすると、証明書エラーが発生します。
Eilistraee、2012

152

どのメインストリームブラウザでも動作することが保証されています(市場シェアが0.05%未満のブラウザは考慮していません)。いや、それはInternet Explorer 3.0で動作します。

RFC 3986は、URIを次の部分で構成されるものとして定義しています。

     foo://example.com:8042/over/there?name=ferret#nose
     \_/   \______________/\_________/ \_________/ \__/
      |           |            |            |        |
   scheme     authority       path        query   fragment

相対URIを定義する場合(セクション5.2)、これらのセクションは常に左から順に省略できます。疑似コードでは、次のようになります。

 result = ""

  if defined(scheme) then
     append scheme to result;
     append ":" to result;
  endif;

  if defined(authority) then
     append "//" to result;
     append authority to result;
  endif;

  append path to result;

  if defined(query) then
     append "?" to result;
     append query to result;
  endif;

  if defined(fragment) then
     append "#" to result;
     append fragment to result;
  endif;

  return result;

説明しているURIは、スキームのない相対URIです。


1
ええ、私は計画と権威は常に相互に依存していると思いました。そうではないことは理にかなっていますが、最近まで私が遭遇したものではありません。
Chris

1
ブラウザでの動作は保証されていません。RFCに準拠しているブラウザでのみ動作することが保証されています。

2
@Roger Pate:ブラウザがURIのRFCに準拠していないことはまだわかりません。その特定の標準は非常に長い間存在してきました...私はIE3.0でそれをテストしたところ、それは完全にうまく理解しています。これらのリンクを理解しないブラウザを使用している場合、それは重要ではないような限界的なブラウザである可能性があります。
Andrew Moore、

1
@Andrew:たぶん私とは違うかもしれませんが、私がプログラミングの文脈で「保証」と言うとき、私は本当に「これが失敗する可能性は決してない」という意味ではなく、「一般的な実装でのみ機能する」という意味ですテストした。」私はそれから大したことをするつもりはなかったが、言及するのに十分重要であるように思われた。

4
@ロジャー:はい、ただしWeb開発のコンテキストでは、限界ブラウザー(<0.01%の市場シェア)は考慮されません。それは、APIがすべてのバージョンのWindowsに存在し、Wineでサポートされていない可能性があると誰かが言ったようなものです
Andrew Moore

79

それが機能しないケースはありますか?

親ページがから読み込まれた場合、file://おそらく機能しません(file://cdn.example.com/js_file.jsもちろん、ローカルで提供することもできます)を取得しようとします。


19
ローカルマシンでhtmlをテストする人には必見です!
Philip007 2013年

ああ...私script src="//..."が働いていなかったのも無理はありません!ローカルでhtmlファイルを開いていました!
wisbucky 2014年

誰かがこれを回避する方法を知っていますか?
km6zla 2015

@ ogc-nick:ローカルWebサーバーを実行できます。構成がゼロの最近のオプションはたくさんあります。とにかく、他の多くのものと同じように(XHRやWebワーカーもファイル:ドメインで機能しない)
Thilo

@Thiloそれは一時的に私のために働いていましたが、私はGithubのElectronでアプリを作っているので、少し複雑になります。
km6zla 2015


25

ここで私はHTMLの隠し機能の答えを複製します

プロトコルに依存しない絶対パスを使用する:

<img src="//domain.com/img/logo.png"/>

ブラウザがSSLを介してHTTPSでページを表示している場合は、httpsプロトコルでそのアセットをリクエストします。それ以外の場合は、HTTPでリクエストします。

これにより、IEの「このページには安全なアイテムと安全でないアイテムの両方が含まれています」というエラーメッセージが表示されなくなり、すべてのアセットリクエストが同じプロトコル内に保持されます。

警告:<link>スタイルシートのa または@importで使用すると、IE7とIE8 はファイルを2回ダウンロードします。ただし、他のすべての用途は問題ありません。


17

プロトコルを省略することは完全に有効です。URL仕様はこれについて何年もの間非常に明確でした、そして私はそれを理解しないブラウザをまだ見つけていません。この手法がよく知られていない理由はわかりません。これは、HTTP / HTTPSの境界を越えるという厄介な問題に対する完璧なソリューションです。詳細:Http-https遷移と相対URL


7

それが機能しないケースはありますか?

これをミックスして投入するだけで、ローカルサーバーで開発している場合は、機能しない可能性があります。スキームを指定する必要があります。そうしないと、ブラウザーはそれをと想定する可能性があります。これsrc="//cdn.example.com/js_file.js"src="file://cdn.example.com/js_file.js"、このリソースをローカルでホストしていないため、これは機能しなくなります。

Microsoft Internet Explorerはこれに特に敏感であるようです。次の質問を参照してください:ローカルホスト(WAMP)のInternet ExplorerでjQueryをロードできません

おそらく、常に最小限の変更で、すべての環境で機能するソリューションを見つけようとするでしょう。

HTML5Boilerplateで使用されるソリューションは、リソースが正しくロードされない場合にフォールバックを行うことですが、これはチェックを組み込んだ場合にのみ機能します。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

更新:HTML5Boilerplate<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js、プロトコル相対URLを廃止することを決定した後に使用するようになりました。[こちら] [3]を参照してください。


4

gnudのリファレンスに従い、RFC 3986セクション5.2は次のように述べています。

スキームコンポーネントが定義されていて、参照がスキーム名で始まることを示している場合、参照は絶対URIとして解釈され、完了です。それ以外の場合、参照URIのスキーマは、ベースURIのスキーマコンポーネントから継承されます

だから//正しいです:-)



3

他の回答が述べているように、それは確かに正しいです。ただし、一部のWebクローラーは、ローカルURLのようにサーバーで要求することにより、これらの404をオフに設定することに注意してください。(ダブルスラッシュは無視され、1つのスラッシュとして扱われます)。

これらをキャッチしてリダイレクトするように、ウェブサーバーにルールを設定することができます。

たとえば、Nginxでは、次のようなものを追加します。

location ~* /(?<redirect_domain>((([a-z]|[0-9]|\-)+)\.)+([a-z])+)/(?<redirect_path>.*) {
  return 301 $scheme:/$redirect_domain/$redirect_path;
}

ただし、URIでピリオドを使用する場合は、具体性を高める必要があります。そうしないと、これらのページが存在しないドメインにリダイレクトされることになります。

また、これは各クエリに対して実行されるかなり大規模な正規表現です-私の意見では、非準拠のブラウザーを、ほとんどの準拠ブラウザーでの(わずかな)パフォーマンスヒットよりも404で罰する価値があります。


3

//somedomain.comをJSファイルへの参照として使用すると、ログに404エラーが表示されます。

404の原因となる参照は次のようになります。ref:

<script src="//somedomain.com/somescript.js" />

404リクエスト:

http://mydomain.com//somedomain.com/somescript.js

これらはWebサーバーのログに定期的に表示されるため、次のように言っても安全です:すべてのブラウザーとボットはRFC 3986セクション4.2を尊重しません。最も安全な方法は、可能な限りプロトコルを含めることです。


ええ、私はそれから少し切り替えましたが、404のせいではありません(404を見たことがありません...ボットがそれを尊重しない場合、私はあまり気にすることができませんでした)。他のCDNなので、これを行う必要はありません(代わりに、1つまたは2つのファイルにできるだけ小さくします)。
ダリルハイン2014年

1
プロトコルを含めてください。プロトコルなしの参照がCordovaアプリで壊れます。
pgorsira 2015

3

1.まとめ

2019年の回答:プロトコル相対URLは引き続き使用できますが、この手法 はアンチパターンです。

また:

  1. 開発に問題があるかもしれません。
  2. 一部のサードパーティツールはそれらをサポートしない場合があります。

プロトコル相対URLからhttps://それに移行するとよいでしょう。


2.関連性

この回答は2019年1月に関連しています。将来、この回答のデータは廃止される可能性があります。


3.アンチパターン

3.1。議論

Paul Irish — フロントエンドエンジニアであり、Google Chromeの開発者である2014年12月に執筆

今、SSLがされていることを皆のための奨励パフォーマンスの懸念を持っていないこの技術は現在、アンチパターンです。必要なアセットがSSLで利用できる場合は、常にそのhttps://アセットを使用してください。

スニペットがHTTP経由でリクエストできるようにすると、最近のGitHub Man-on-the-side攻撃のような攻撃の可能性が開かれます。サイトがHTTP上にある場合でもHTTPSアセットをリクエストしても常に安全ですが、その逆は当てはまりません

3.2。別のリンク

3.3。例


4.開発プロセス

たとえば、私はclean-consoleを使用しようとします。

  • ファイルの例KiraCleanConsole__cdn_links_demo.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>clean-console without protocol demonstration</title>
    <!-- Really dead link -->
    <script src="https://unpkg.com/bowser@latest/bowser.min.js"></script>
    <!-- Package exists; link without “https:” -->
    <script src="//cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js"></script>
    <!-- Package exists: link with “https:” -->
    <script src="https://cdn.jsdelivr.net/npm/gemini-scrollbar/index.js"></script>
</head>
<body>
    Kira Goddess!
</body>
</html>
  • 出力:
D:\SashaDebugging>clean-console -i KiraCleanConsole__cdn_links_demo.html
checking KiraCleanConsole__cdn_links_demo.html
phantomjs: opening page KiraCleanConsole__cdn_links_demo.html

phantomjs: Unable to load resource (#3URL:file://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js)


phantomjs:   phantomjs://code/runner.js:30 in onResourceError
Error code: 203. Description: Error opening //cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.js: The network path was not found.

  phantomjs://code/runner.js:31 in onResourceError

phantomjs: Unable to load resource (#5URL:https://unpkg.com/bowser@2.1.0/bowser.min.js)


phantomjs:   phantomjs://code/runner.js:30 in onResourceError
Error code: 203. Description: Error downloading https://unpkg.com/bowser@2.1.0/bowser.min.js - server replied: Not Found

  phantomjs://code/runner.js:31 in onResourceError

phantomjs: Checking errors after sleeping for 1000ms
2 error(s) on KiraCleanConsole__cdn_links_demo.html

phantomjs process exited with code 2

リンク//cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.jsは有効ですが、エラーが発生します。

Thilobg17awの回答に注意しfile://cdn.jsdelivr.net/npm/jquery@3.3.1/dist/jquery.min.jsて読んでください。file://

私はこの動作について知らなかったし、なぜpageresでこのような問題が発生するのか理解できませんでした


5.サードパーティツール

クリック可能なURLの崇高なテキストパッケージを使用しています。それを使用して、ブラウザーでテキストエディターからリンクを開くだけです。

CSSリンクの例

例の両方のリンクが有効です。しかし、ブラウザで正常に開くことができる最初のリンクは、クリック可能なURL、2番目のリンクを使用します—いいえ。これはあまり便利ではないかもしれません。


6.まとめ

はい:

  1. Developing processアイテムのように問題がある場合は、開発ワークフローを設定できます。
  2. そうでなければ、Third-party toolsアイテムのように問題があれば、ツールを提供することができます。

しかし、この追加の問題は必要ありません。Anti-patternアイテム内のリンクごとに情報を読み取ります。プロトコル相対URLは廃止されました。


2

私がhtml5-boilerplateに表示するパターンは次のとおりです。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

それはのような異なる方式にスムーズに動作しますhttphttpsfile


これはもはや真で、見ないstackoverflow.com/a/37609402/2237601をここで彼らが今使用して、https://すべてのために
bg17aw

@ bg17aw https://everywhere を使用する場合の問題は、すべての外部リンクをチェックして、実際にサポートされているかどうかを確認し、サポートされhttp://ていない場合は変更する必要があります(それ以外の場合は機能しません)。これは、リンクの数が多い場合に問題になる可能性があります。
tomasz86 2017

@ tomasz86あなたは要点を逃しています、私はCDNからのコンテンツにリンクする特定のケースにのみ言及していました。今日ではhttps://が必須です。答えは、特定のケース(html5-boilerplate)についても述べています。CDNは常にhttpsを使用するため、「httpのチェック」はありません。
bg17aw

@ bg17awそれは本当ですが、ここでの一般的な質問はCDNについてだけではありません。この回答/コメントだけを読むと、https://正しくないすべてのリンクで使用する必要がある(または使用できる)と考えるのは簡単です。
tomasz86 2017

@ tomasz86複数の回答を持つことの利点は、それらのどれも完全ではない(回答が完全である場合、他は削除する必要がある)一方で、それらのいくつかを読むと、より広い視野が得られることです。この場合、答えは「html5boilerplateのパターンは...」であり、私のコメントは「html5-boilerplateのパターンではなくなった」と述べてこの回答を更新します。それでおしまい。この特定の答えに必要な追加。また、元の質問は確かにCDNに関するものです。
bg17aw 2017年

1

この例は外部ドメインにリンクしているため、HTTPSを使用している場合は、外部ドメインもSSL用に設定されていることを確認する必要があります。そうしないと、ユーザにSSLエラーや404エラーが表示される場合があります(たとえば、古いバージョンのPleskはHTTPとHTTPSを別々のフォルダに保存します)。CDNの場合は問題になりませんが、他のWebサイトの場合は問題になる可能性があります。

余談ですが、古いWebサイトの更新中にテストされ、META REFRESHのurl =の部分でも機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.