Разрешены ли квадратные скобки в URL-адресах?

разрешены ли квадратные скобки в URL-адресах?

Я заметил, что Апач Коммонс с помощью HttpClient (3.0.1) бросает исключение IOException, wget и Firefox, однако принимают квадратные скобки.

URL-адрес, например:

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

мой HTTP-клиент встречает такие URL-адреса, но я не уверен, исправлять ли код или создавать исключение (как это на самом деле должно быть).

10 ответов


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-адрес копируется в другую систему, использует ли их, не нужно будет менять кодировку URL.

ответ:должны быть закодированным шестнадцатью, но, зная закон постеля, большинство вещей примет их дословно.


для использования класса HttpClient commons вы хотите заглянуть в организацию.апаш.палата общин.с помощью HttpClient.утиль.Класс URIUtil, в частности метод encode (). Используйте его для URI-кодирования URL-адреса, прежде чем пытаться его получить.


StackOverflow, похоже, не кодирует их:

https://stackoverflow.com/search?q=square + скобки+[url]


лучше всего кодировать URL-адреса, поскольку они явно не поддерживаются на всех веб-серверах. Иногда, даже когда есть стандарт, не все ему следуют.


по словам спецификация URL, квадратные скобки не являются допустимыми символами URL.

вот соответствующие фрагменты:

символы "национальный" и "пунктуация" не отображаются ни в одном productions и поэтому могут не отображаться в 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")"
    
  • Использование Java 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. Этот Приложение A о %-encoding в строке запроса (скобки, принадлежащие "gen-delims" на %-encoded).


квадратные скобки, считаются небезопасными, но большинство браузеров правильно обработать их. Сказав, что лучше заменить квадратные скобки и некоторые другие символы.