두 개의 슬래시로 시작하는 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)에 따르면 두 개의 슬래시로 시작하는 이러한 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
그래서 이것이 자바 스크립트를 사용하여 http 또는 https를 결정하는 솔루션이 될 수
있습니까

부모 수준에 도달해야하므로 사용 ../g— 현재 프로토콜을 사용하고 http://a/b/c/g.
Boris S

초보 질문 일 수 있지만이 기본 URI는 어디에서 왔습니까? 브라우저 URL 표시 줄? 서버? html 페이지의 태그?
coderatchet 2014

1
@thenaglecode : 대답은 상황에 따라 다릅니다. XML / XHTML / HTML5에서는 사용 xml:base하는 모든 요소에 명시 적으로 설정 . 기본적으로 HTML에서 기본 URI는 페이지의 동일한 URI입니다 (그러나 CSS 파일 내에서 기본 URI는 포함하는 HTML 이 아니라 CSS uri에 상대적 이지만 이전 IE는 HTML에 상대적으로 만들었습니다). 다른 프로토콜과 언어에서는 다를 수 있습니다 (예를 들어 XSLT에서는 현재 항목에 따라 다름). 을 (를) 참조하십시오 <html:base>.
Abel

1
중요-결과가 항상 그런 것은 아닙니다 http! 페이지 컨텍스트의 프로토콜에 따라 다릅니다. 컨텍스트가 아래에로드 된 http://a/b/c/d;p?q경우 //g실제로 http://g. 그러나 페이지가로드 된 http://a/b/c/d;p?q경우 결과는 https://g. 또한 file://(페이지가 디스크에서로드 됨) 과 같은 다른 프로토콜도 잊지 마십시오. 이는 확실히 많은 골칫거리가 될 것입니다.
안드레이 Tserkus

62

이들은 프로토콜 상대 URL을. 현재 프로토콜을 유지하면서 주소를 가리 킵니다.

이 표기법은 종종 "혼합 콘텐츠"문제 ( 동일한 HTTPS 페이지의 리소스 httphttps리소스에 대해 불평하는 IE 경고 메시지)를 방지하는 데 사용됩니다 .

업데이트 : RFC 3986의 공식 문서 :

두 개의 슬래시 문자로 시작하는 상대 참조를 네트워크 경로 참조라고합니다. 이러한 참조는 거의 사용되지 않습니다. 단일 슬래시 문자로 시작하는 상대 참조를 절대 경로 참조라고합니다. 슬래시 문자로 시작하지 않는 상대 참조를 상대 경로 참조라고합니다.


알아두면 좋지만 널리 사용되는 브라우저에서 이것이 얼마나 호환되는지. 빠른 검색 결과 IE6에서 작동하지 않는다고 나타납니다. HTML5 기능입니까 ??
Shane N

4
@Shane 모든 브라우저에서 작동합니다. IE6에서 작동하지 않는다고 주장하는 링크가 있습니까?
Pekka 2011 년

4
IE1 기능인지 확실합니다!
존 한나

플러스 상대 프로토콜을 언급위한
타우 픽 Khalifeh을


1

http 또는 https와 무관 할뿐만 아니라 파일 , ftp에 대해서도 유의하십시오. .

즉 , localhost의 브라우저에서 직접 .htm 파일 을 열면 브라우저가 // 파일 프로토콜로 해석 됩니다. 되고 페이지가 작동하지 않습니다. Electron, PhoneGap 등과 같은 도구를 사용하는 "네이티브"앱으로 압축 된 웹 사이트에서 문제를 일으킬 수 있습니다.

예:

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