URL에 공백이 포함될 수 있습니까?


132

URI (특히 HTTP URL)에 공백 문자가 하나 이상 포함될 수 있습니까? URL 인코딩 해야하는 경우 +일반적으로 따르는 규칙입니까, 아니면 합법적 인 대안입니까?

특히 누군가 공백이있는 URL을 인코딩 해야 함 을 나타내는 RFC를 가리킬 수 있습니까?

질문 동기 부여 : 웹 사이트를 베타 테스트하는 동안 일부 URL은 공백으로 구성되어 있습니다. 파이어 폭스는 옳은 일을하는 것처럼 보였습니다. 그러나 개발자가 해당 URL을 수정해야 할 필요성을 느끼도록 RFC를 지적하고 싶었습니다.


나중에 나오는 수퍼 셋 : 유효하지 않은 문자는 무엇입니까 : stackoverflow.com/questions/1547899/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

답변:


101

당으로 RFC 1738 :

위험한:

여러 가지 이유로 문자가 안전하지 않을 수 있습니다. 공백 문자는 유효하지 않은 공백이 사라지고 URL이 전사되거나 조판되거나 워드 프로세싱 프로그램의 처리를받을 때 중요하지 않은 공백이 생길 수 있으므로 안전하지 않습니다. 문자 "<"">"그들이 무료 문자의 URL 주변의 구분 기호로 사용되기 때문에 안전하지; 따옴표 ( """)는 일부 시스템에서 URL을 구분하는 데 사용됩니다. 문자 "#"는 안전하지 않으며 월드 와이드 웹 및 다른 시스템에서 URL을 뒤에 오는 프래그먼트 / 앵커 식별자와 구분하기 위해 사용되므로 항상 인코딩해야합니다. 캐릭터"%"다른 문자의 인코딩에 사용되므로 안전하지 않습니다. 게이트웨이 및 기타 전송 에이전트가 때때로 이러한 문자를 수정하는 것으로 알려져 있기 때문에 다른 문자는 안전하지 않습니다. 이 문자는 "{", "}", "|", "\", "^", "~", "[", "]",와 "`".

안전하지 않은 모든 문자는 항상 URL 내에 인코딩해야합니다 . 예를 들어, 문자 "#"는 일반적으로 조각 또는 앵커 식별자를 처리하지 않는 시스템에서도 URL 내에서 인코딩되어야하므로 URL을 사용하는 다른 시스템으로 URL을 복사하는 경우 URL 인코딩을 변경할 필요가 없습니다.


2
1738 2396 중단 되었기있다 ietf.org/rfc/rfc2396.txt 즉 현재 열린 사양이다. 이 경우에는 중요하지 않습니다.
Steve Severance

40
그리고 2396은 3986에 의해 대체되었습니다. 많은 사람들이 RFC를 변경할 수 없기 때문에 이것을 잘못 알고 있기 때문에 독자들에게 더 이상 사용되지 않았다고 말하지 않습니다. 힌트 : tools.ietf.org/html/rfc2396 과 같은 tools.ietf.org/html/rfcnnnn을 사용하면 누락 된 메타 데이터가 맨 위에 표시됩니다.
Julian Reschke

43

왜 인코딩해야합니까? 요청은 다음과 같습니다.

GET /url HTTP/1.1
(Ignoring headers)

공백으로 구분 된 3 개의 필드가 있습니다. URL에 공백을 넣으면 :

GET /url end_url HTTP/1.1

당신은 4 개의 필드를 알고있다. HTTP 서버는 그것이 유효하지 않은 요청이라고 알려줄 것이다.

GET /url%20end_url HTTP/1.1

3 개 필드 => 유효

참고 : 쿼리 문자열 (? 뒤에)에서 공백은 일반적으로 +

GET /url?var=foo+bar HTTP/1.1 

오히려

GET /url?var=foo%20bar HTTP/1.1 

var가 "foo bar"가 아닌 "foo + bar"인 경우 어떻게합니까?
Ivo3185

2
URI 사양 자체가 아니라 전송 계층의 요구 사항이라고 주장합니다. GET은 URL 사양이 아닌 http : 사양의 속성입니다. 마찬가지로 웹 페이지가 손상 될 수 있으므로 URL의 인용 부호를 "필수"로 인코딩 할 수 있습니다. 그러나 이는 URL 사양의 속성이 아닌 HTML 형식 제한의 속성입니다 (에 대한 다른 전략이 있음).
Kent Fredric

ietf.org/rfc/rfc1738.txt- 공백을 포함하여 안전하지 않은 문자)를 인코딩해야합니다
Julien

@KentFredric 전송 레이어가 아닌 프레젠테이션 레이어 일 가능성이 높습니다 . Julien (거의)이 작성 했듯이 원래 URI 사양 ( RFC 1630 )에는이 제한이 포함되어 있으므로 개인적인 느낌에 관계없이 URI 사양 자체의 일부입니다. URI 사양은 HTTP 초안 이후 에 작성 되었으므로 공백 사용 금지를 포함하여 HTTP를 염두에두고 URI를 설계했을 가능성이 있지만 실제로 중요하지는 않습니까? 진실은 스펙이 스펙이라는 것입니다.
Christopher Schultz

38

짧은 대답 : 아니요, 공백을 인코딩해야합니다. 이다 과 같은 공간을 인코딩하는 올바른 +만 쿼리 문자열에; 경로에서 사용해야합니다 %20.


1
안녕, 나도 혼란스러워, 언젠가 책이 "+"를 사용하지만 언젠가 "% 20"을 보았는데 이것에 대한 예를 보여줄 수 있습니까? 사용자가 양식을 제출하면 양식이 어떻게 공백을 인코딩합니까? 어떤 캐릭터와 함께?
GMsoF

1
자세한 내용은 이 답변 을 참조하십시오 .
DavidRR

조각 / 해시 부분은 어떻습니까? 공백은 어떻게 인코딩해야합니까?
gumkins

@gumkins : 조각 (# 및 이후)이 서버로 전송되지 않습니다. 실제로 % 20 또는 +를 사용하여 공간을 인코딩 할 수 있습니다.
Julien

9

URL은 RFC 3986에 정의되어 있지만 다른 RFC도 관련이 있지만 RFC 1738 은 더 이상 사용되지 않습니다.

다른 많은 문자와 함께 공백이 없을 수 있습니다. 금지 된 문자는 종종 어떤 식 으로든 표현되어야하기 때문에 "%"접두사를 사용하여 ASCII 16 진수로 변환하여 URL로 인코딩하는 체계가 있습니다.

대부분의 프로그래밍 언어 / 플랫폼은 URL 인코딩 및 디코딩 기능을 제공하지만 RFC 표준을 제대로 준수하지 않을 수 있습니다. 예를 들어, PHP가 그렇지 않다는 것을 알고 있습니다.


7

예, 공백은 보통 "% 20"으로 인코딩됩니다. 안전상의 이유로 URL로 전달되는 모든 매개 변수는 인코딩해야합니다.


6

URL에는 공백 문자가 포함될 수 있으며 대부분의 브라우저에서 % 20으로 표시되지만 브라우저 인코딩 규칙은 자주 변경되므로 브라우저가 URL을 표시하는 방법에 의존 할 수 없습니다.

따라서 URL의 공백 문자를 URL을 더 읽기 쉽게 만들고 'Pretty';) .......로 만들 것으로 생각되는 문자로 대체 할 수 있습니다. 따라서 O가 선호되는 일반적인 문자는 "-", "_", "+".... 그러나 이것들은 강박이 아니기 때문에 이미 URL에없는 문자를 사용할 수 있습니다.

%, &,}, {,], [, /,>, <를 URL 공백 문자 대체로 사용하지 마십시오. 특정 브라우저 및 플랫폼에서 오류가 발생할 수 있습니다.

보시다시피 Stak overflow 자체는 '-'문자를 Space (% 20) 교체로 사용합니다.

행복한 질문이 있습니다.


5

URL은해야 하지 그들에 공백이있다. 그 중 하나를 해결 해야하는 경우 인코딩 된 값을 사용하십시오.%20


5

누군가 공백이있는 URL을 인코딩해야 함을 나타내는 RFC를 가리킬 수 있습니까?

URI 및 URL은 RFC 3986에 정의되어 있습니다.

거기에 정의 된 문법을 보면 공백 문자가 구문 상 유효한 URL의 일부가 될 수 없으므로 "공백이있는 URL"이라는 용어 자체는 모순입니다.


3

귀하의 질문에 대답하십시오. 응용 프로그램이 URL에서 사용될 값의 공백을 대체하는 것이 일반적이라고 말합니다. 그 이유는 일반적으로 발생하는 읽기 어려운 퍼센트 (URI) 인코딩을 피하기 위해서입니다.

퍼센트 인코딩 에 대한이 위키 백과 기사를 확인하십시오 .


2

Firefox 3는 %20주소 표시 줄에 공백으로 URL의을 표시합니다.


이것은 매우 간단한 질문에 대한 올바른 대답이 아닙니다 "Is a URL allowed to contain a space?". 오히려 의견.
Roko C. Buljan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.