URL에서 이중 슬래시는 무엇을 의미합니까?


32

URL에서 이중 슬래시가 종종 무엇을 의미합니까?

예를 들면 다음과 같습니다.

  • http://www.example.com/A/B//C/

바로 시작 부분을 언급하지 않습니다 http:.

답변:


32

프로그래머 / 개발자 코드의 오류입니다. 이 두 URL을 비교하면 다음과 같습니다.

  • http://www.example.com/A/B/C/
  • http://www.example.com/A/B//C/

그들은 다르게 보이지만 둘 중 하나를 방문한다면 둘 다 최신 브라우저에서 작동합니다.

이것은 당신이 고치고 싶은 것입니다. 이중 슬래시가 있으면 Google의 웹 크롤러를 혼동하여 페이지의 두 가지 버전이 있다고 생각할 수 있습니다.


11
실제로 페이지로드는 브라우저 와 관련이 없지만 서버 는 추가 슬래시를 무시합니다. 시간이 오래 걸리므로 게시 한 답변을 참조하십시오 .
josh3736

33

@RandomBen 에서 언급했듯이 이중 슬래시는 어딘가에 오류가 발생했을 가능성이 큽니다.

페이지로드는 브라우저 와 관련이 없지만 서버 는 추가 슬래시를 무시합니다. 브라우저는 URL에 추가 슬래시를 사용하여 특별한 작업을 수행하지 않으며 요청에 따라 슬래시를 보냅니다.

GET /A/B//C/D HTTP/1.1
Host: www.example.com
...

현재 버전의 Apache와 IIS는 경로를 확인하는 동안 추가 슬래시를 무시하고 URL에 추가 슬래시가 없으면 반환 된 문서를 반환합니다. 그러나 브라우저 (IE 8 및 Chrome 9 테스트)는 페이지의 리소스에 대한 상대 URL (부모 경로 구성 요소 포함)과 혼동되어 결과가 좋지 않습니다. 예를 들어, 페이지에 다음이있는 경우 :

<link rel="stylesheet" href="../../style.css" type="text/css" />

페이지를로드하면 /a/b/c/브라우저가 요청 /a/style.css합니다. 그러나 어떤 이유로 든 /a/b//c/서버가 추가 슬래시를 무시하면 요청하면 브라우저가 /a/b/style.css존재하지 않습니다. 죄송합니다. 페이지가보기 흉하게 보입니다.

(URL에 부모 경로 구성 요소 ..가 없거나 절대적인 경우에는 발생하지 않습니다 .)

아파치와 IIS (그리고 아마도 다른 것들)가 두 가지 다른 자원 으로 잘못 작동 /a/b/c/하고 /a/b//c/기술적으로 대표 한다고 생각 합니다. RFC 2396 에 따르면 모든 슬래시는 중요합니다.

  path          = [ abs_path | opaque_part ]

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param )
  param         = *pchar

  pchar         = unreserved | escaped |
                  ":" | "@" | "&" | "=" | "+" | "$" | ","

따라서 /a/b/c/"a", "b"및 "c"의 세 부분으로 구성됩니다. /a/b//c/실제로 "a", "b", ""(빈 문자열) 및 "c"의 4 개로 구성됩니다. 빈 문자열이 유효한 파일 시스템 디렉토리인지 여부는 서버 플랫폼의 세부 사항입니다. 논리적으로 이것은 부모 경로 구성 요소를 사용하여 상대 URL을 구문 분석 할 때 브라우저가 실제로 올바르게 작동한다는 것을 의미합니다. 예를 들어 "c"디렉토리와 ""디렉토리를지나 style.css"b"의 요청 을 남겨 둡니다 .)

에서 Apache를 사용 mod_rewrite하는 경우 매우 간단한 수정 사항이 있습니다 .

# remove multiple slashes anywhere in url 
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ 
RewriteRule . %1/%2 [R=301,L] 

이렇게하면 301 Moved Permanently이중 슬래시가 URL에서 제거되도록 HTTP 리디렉션 이 발행 됩니다.


2
mod_rewrite솔루션이 3, 4, ... 슬래시도 고려 하는 것이 더 좋지 않습니까? 라인을 따라 뭔가 /{2,}? (Apache가 그런 종류의 정량
자를

+1-추가 정보 감사합니다. 나는 그렇게 생각하지 않았다!
벤 호프만

3
그것은 아니다 잘못된 행동 : a/b그리고 a//b실제로 두 가지 URL 경로가 있지만 아무것도 그것을 원하는 경우 둘 다 동일한 자원을 반환에서 서버를 금지합니다. 그러나 실제로는 301 리디렉션을 반환하면 더 유용 할 것입니다.
Ilmari Karonen

4
@IlmariKaronen : 그것은 절대적으로 (1)이 동작 때문에 잘못된 동작이다 자동으로 단일 리소스에 대한 잠재적 중복 참조의 무한한 수를 생성 (이 아니라 어떤 사양의 문자 위반, 확실히 정신을 위반하는 경우) 등을 실질적으로 (2) 빈 문자열을 a//b디렉토리로 올바르게 계산하는 브라우저에서 상대 경로 처리를 "중단"합니다 (위의 스타일 시트 예제 참조).
josh3736

1
... 어쨌든 RFC 2396 슬래시를 자동 축소하여 서버가 동일한 리소스를 반환하는 것을 금지 한다고 주장합니다 . 사양에는 모든 슬래시가 중요하기 때문입니다. 연속 슬래시를 자동으로 무시하는 것은 해당 사양을 위반합니다. (누군가가 서버를 그렇게하도록 프로그래밍 한 경우, 어리석은 일이지만, 기본적으로이 작업을 수행하는 서버 올바르지 않습니다.)
josh3736

4

이중 슬래시는 자원 URL에 사용될 때 의미가 있습니다. 예를 들어, 배경 이미지의 URL을 CSS에서 사용하는 경우 :

.classname {
    background : url("//example.com/a/b/c/d.png");
}

여기서이 배경 이미지가 현재 웹 페이지의 도메인이 아닌 다른 도메인에서 가져오고 있음을 의미합니다. 즉, 리소스 URL에서 사용할 때 http://와 같이 작성할 수 있습니다 //.

그러나 URL 사이의이 이중 슬래시 (예 :)는 /a//b/c/d.htm의미가 없습니다.


글쎄, 이것은 진실이 아닙니다. 이중 슬래시는 혼합 컨텐츠 문제를 피해야 할 때 사용되므로 사이트가 http에서로드되면 이중 슬래시는 http로 확장되고, 사이트가 https에서로드되면 이중 슬래시는 https로 확장됩니다.
andrej

2

언급했듯이 일부 서버는 URL 경로에서 이중 슬래시를 무시하도록 설정되어 있지만 Amazon S3 정적 호스팅은 그렇지 않습니다. 이 경우 처리 / 무시하려는 경우 속성 패널에서 리디렉션 규칙 을 사용할 수 있습니다 .

도메인 이름 뒤에 이중 슬래시를 무시하려면 다음과 같이 사용할 수 있습니다.

<RoutingRules>
  <RoutingRule>
    <Condition>
      <KeyPrefixEquals>/</KeyPrefixEquals>
    </Condition>
    <Redirect>
      <ReplaceKeyPrefixWith/>
    </Redirect>
  </RoutingRule>
</RoutingRules>

당신은 아마 그들을 통해 찾아 교체 할 수 있지만 그것은 충분했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.