2つのスラッシュで始まるURI…それらはどのように動作しますか?


92

最近、私はこのように動作するコードブロックを見ました

<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

また、RFC 2396(URI構文)およびRFC 2616(HTTP 1.1)によると、2つのスラッシュで始まるこれらのURIは有効ですが、残念ながらRFCは実際にはそれらを説明していません。

ブラウザーがこれらのURIをどのように処理する/すべき/処理するのかを説明しているリソースを誰かに教えてもらえますか?

回答:


86

探しているリソースはRFC 3986です。

セクション4.2およびセクション5.4を参照してください。後者からの引用:

参照解決の例

以下の明確に定義されたベースURIを持つ表現内:

    http://a/b/c/d;p?q

相対参照は、次のようにターゲットURIに変換されます。

  "g:h"           =  "g:h"
  "g"             =  "http://a/b/c/g"
  "./g"           =  "http://a/b/c/g"
  "g/"            =  "http://a/b/c/g/"
  "/g"            =  "http://a/g"
  "//g"           =  "http://g"
  "?y"            =  "http://a/b/c/d;p?y"
  "g?y"           =  "http://a/b/c/g?y"
  "#s"            =  "http://a/b/c/d;p?q#s"
  "g#s"           =  "http://a/b/c/g#s"
  "g?y#s"         =  "http://a/b/c/g?y#s"
  ";x"            =  "http://a/b/c/;x"
  "g;x"           =  "http://a/b/c/g;x"
  "g;x?y#s"       =  "http://a/b/c/g;x?y#s"
  ""              =  "http://a/b/c/d;p?q"
  "."             =  "http://a/b/c/"
  "./"            =  "http://a/b/c/"
  ".."            =  "http://a/b/"
  "../"           =  "http://a/b/"
  "../g"          =  "http://a/b/g"
  "../.."         =  "http://a/"
  "../../"        =  "http://a/"
  "../../g"       =  "http://a/g"

これは、ベースURIがでhttp://a/b/c/d;p?qあり、使用する//gと、相対参照がに変換されることを意味しますhttp://g


4
これは決定するためにJavaScriptを使用しての解決策になることができ、HTTPまたはHTTPSそれが動作しますが何であれ、このよう
伊武

親レベルに到達する必要があるため、使用します../g—現在のプロトコルを使用し、につながりhttp://a/b/c/gます。
Boris S

初心者の質問かもしれませんが、このベースURIはどこから来たのですか?ブラウザのURLバー?サーバー?HTMLページのタグ?
coderatchet 14

1
@thenaglecode:答えは、場合によります。XML / XHTML / HTML5では、使用することができますxml:baseして任意の要素に明示的に設定します。デフォルトでは、HTMLのベースURIはページのURIと同じです(ただし、CSSファイル内では、ベースURIはCSSの URIを基準にしており、含まれているHTMLはありませんが、古いIEはHTMLを基準にしています)。他のプロトコルや言語では、異なる場合があります(たとえば、XSLTでは、現在のアイテムに依存します)。もご覧ください<html:base>
アベル、

1
重要-結果は常にではありませんhttp!ページコンテキストのプロトコルによって異なります。コンテキストがでロードされたhttp://a/b/c/d;p?q場合、//g実際にはに解決されhttp://gます。しかし、ページがロードされたhttp://a/b/c/d;p?q場合、結果はになりますhttps://g。また、file://(ページがディスクからロードされる)のような他のプロトコルについても忘れないでください-これは間違いなく多くの頭痛の種になります。
Andrey Tserkus

62

これらはプロトコル関連のURLです。現在のプロトコルを維持しながら、アドレスを指します。

この表記法は、「混合コンテンツ」の問題(同じHTTPSページ上のリソースhttphttpsリソースについてのIE警告メッセージ)を回避するためによく使用されます。

更新:RFC 3986の公式ドキュメント

2つのスラッシュ文字で始まる相対参照は、ネットワークパス参照と呼ばれます。このような参照はほとんど使用されません。単一のスラッシュ文字で始まる相対参照は、絶対パス参照と呼ばれます。スラッシュ文字で始まらない相対参照は、相対パス参照と呼ばれます。


知っておきたいことですが、一般的なブラウザでこれはどの程度準拠していますか。クイック検索で、IE6では機能しないことがわかりました...これはHTML5機能ですか?
シェーンN

4
@Shaneこれはすべてのブラウザで機能するはずです。IE6では機能しないと主張するリンクはありますか?
Pekka

4
IE1の機能であることを確認してください。
Jon Hanna

さらに、プロトコル関連について言及した場合
Tawfik Khalifeh 2014


1

httphttpsに依存しないだけでなく、fileftpなどにも注意してください。

つまり、ローカルホスト上のブラウザーで.htmファイルを直接開いた場合、ブラウザーはファイルプロトコルとして//を解決し、ページは機能しません。Electron、PhoneGapなどのツールを使用した「ネイティブ」アプリとしてパックされたWebサイトで問題が発生する可能性があります。

例:

<script src="//mywebsite.com/resource.js"></script>

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