문제

URL에 대괄호가 허용됩니까?

난 그것을 알아 챘다 아파치 커먼즈 HttpClient (3.0.1)에서는 IOException이 발생하지만 wget 및 Firefox에서는 대괄호를 허용합니다.

URL 예:

http://example.com/path/to/file[3].html

내 HTTP 클라이언트가 이러한 URL을 발견했지만 코드를 패치해야 할지 아니면 예외를 발생시켜야 할지 잘 모르겠습니다(실제로 그래야 함).

도움이 되었습니까?

해결책

RFC 3986

인터넷 프로토콜 리터럴 주소, 버전 6 [RFC3513] 이상으로 식별 된 호스트는 정사각형 괄호 안에 ip 문자를 둘러싸고 구별됩니다 ( ["및 "]).이것은 URI 구문에서 정사각형 브래킷 문자가 허용되는 유일한 곳입니다.

따라서 이러한 URI는 인코딩되어 도착해야 하므로 이론상으로는 실제 환경에서 볼 수 없습니다.

다른 팁

이 질문이 약간 오래되었다는 것을 알고 있지만 PHP는 URL에서 배열을 전달하기 위해 대괄호를 사용한다는 점에 주목하고 싶었습니다.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

이 경우 $_GET['bar'] 포함할 것이다 array(1, 2, 3).

URL을 허용하고 특수 문자가 도입될 때 예외를 발생시키지 않는 모든 브라우저 또는 웹 지원 소프트웨어는 뒤에서 특수 문자를 인코딩하는 것이 거의 보장됩니다.중괄호, 대괄호, 공백 등은 모두 충돌을 일으키지 않도록 특수하게 인코딩된 방식으로 표현됩니다.이전 답변에 따라 이를 처리하는 가장 안전한 방법은 URL을 해결하려고 시도할 대상에 전달하기 전에 URL을 인코딩하는 것입니다.

경로 이름에 허용되지 않는 문자는 # 및 ?뿐입니다.길의 끝을 의미하기 때문입니다.

uri rfc에는 최종 답변이 있습니다.

http://www.ietf.org/rfc/rfc1738.txt

위험한:

캐릭터는 여러 가지 이유로 안전하지 않을 수 있습니다.우주 문자는 상당한 공간이 사라질 수 있고 URL이 전사되거나 조립화되거나 워드 프로세싱 프로그램의 처리에 적용될 때 중요하지 않은 공간이 도입 될 수 있기 때문에 안전하지 않습니다."<"및 ">"문자는 무료 텍스트의 URL 주변 구분 제로 사용되기 때문에 안전하지 않습니다.견적 마크 ( "" ")는 일부 시스템에서 URL을 구분하는 데 사용됩니다.캐릭터 "#"는 안전하지 않으며 월드 와이드 웹 및 기타 시스템에서 사용되기 때문에 항상 인코딩되어야합니다.캐릭터 "%"는 다른 문자의 인코딩에 사용되기 때문에 안전하지 않습니다.게이트웨이와 다른 운송 에이전트는 때때로 그러한 문자를 수정하는 것으로 알려져 있기 때문에 다른 캐릭터는 안전하지 않습니다.이 문자는 "{", "}", "|", "", "^", "~", [", "]및 "`"입니다.

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

대답은 그들이 ~해야 한다 16진수로 인코딩되지만 포스텔의 법칙을 알면 대부분의 경우 그대로 받아들일 것입니다.

HttpClient 공용 클래스를 사용하려면 org.apache.commons.httpclient.util.URIUtil 클래스, 특히 encode() 메서드를 살펴보고 싶을 것입니다.URL을 가져오기 전에 URL을 URI 인코딩하는 데 사용하세요.

StackOverflow가 인코딩하지 않는 것 같습니다.

https://stackoverflow.com/search?q=square+brackets+[url]

모든 웹 서버에서 명확하게 지원되지는 않으므로 이를 URL 인코딩하는 것이 가장 좋습니다.때로는 표준이 있어도 모든 사람이 이를 따르지 않는 경우도 있습니다.

에 따르면 URL 사양, 대괄호는 유효한 URL 문자가 아닙니다.

관련 스니펫은 다음과 같습니다.

"국가적"및 "구두점"문자는 프로덕션에 나타나지 않으므로 URL에 나타나지 않을 수 있습니다.
국가 {| } | vline | [| ] | | ^ | ~
구두점 <| >

대괄호 [ 그리고 ] URL은 종종 지원되지 않습니다.

다음으로 교체하세요. %5B 그리고 %5D:

  • 명령줄을 사용하는 다음 예는 다음을 기반으로 합니다. bash 그리고 sed:

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • 자바 사용 URLEncoder.encode(String s, String enc)

  • PHP 사용 rawurlencode() 또는 urlencode()

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    산출:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    또는:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • 좋아하는 프로그래밍 언어를 사용하여...프로그래밍 언어에서 사용하는 기능을 추가하려면 댓글을 게시하거나 이 답변을 직접 편집하여 이 답변을 확장하세요. ;-)

자세한 내용은 다음을 참조하세요. RFC 3986 URL 구문을 지정합니다.그만큼 부록 에 관한 것입니다 %-encoding 쿼리 문자열(대괄호는 다음에 속함) "겐-델리미스" 장차 ~ 가 되는 %-encoded).

대괄호는 안전하지 않은 것으로 간주되지만 대부분의 브라우저는 이를 올바르게 구문 분석합니다.대괄호를 다른 문자로 바꾸는 것이 더 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top