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

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

Я заметил, что Apache commons HttpClient (3.0.1) генерирует исключение IOException, однако wget и Firefox принимают квадратные скобки.

Пример URL:

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

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

Ответы

Ответ 1

RFC 3986 утверждает

Хост, идентифицированный в Интернете Литеральный адрес протокола, версия 6 [RFC3513] или более поздняя версия путем включения IP-литерала в пределах квадратные скобки ( "[" и "]" ). Эта это единственное место, где квадратная скобка символы разрешены в URI синтаксис.

Таким образом, вы не должны видеть такой URI в дикой природе в теории, поскольку они должны поступать в кодировку.

Ответ 2

Я знаю, что этот вопрос немного устарел, но я просто хотел заметить, что PHP использует скобки для передачи массивов по URL-адресу.

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

В этом случае $_GET['bar'] будет содержать array(1, 2, 3).

Ответ 3

Любое программное обеспечение, поддерживающее браузер или веб-приложение, которое принимает URL-адреса и не генерирует исключение при вводе специальных символов, почти гарантированно кодирует специальные символы за кулисами. Кудрявые скобки, квадратные скобки, пробелы и т.д. Имеют специальные закодированные способы их представления, чтобы не создавать конфликтов. Согласно предыдущим ответам, самый безопасный способ справиться с ними - это кодировать их URL перед передачей их на то, что будет пытаться разрешить URL.

Ответ 4

В значительной степени единственными символами, недопустимыми в путях, являются # и? поскольку они означают конец пути.

Ури rfc получит окончательный ответ:

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

Опасный:

Персонажи могут быть небезопасными по ряду причин. Космос   символ небезопасен, поскольку значительные пробелы могут исчезнуть и   незначительные пробелы могут быть введены, когда URL-адреса транскрибируются или   набирать или подвергать обработке текстовых программ.   Символы "<" и " > " являются небезопасными, поскольку они используются как   разделители вокруг URL-адресов в свободном тексте; метка кавычки ( "" ) используется для   разграничить URL-адреса в некоторых системах. Символ "#" небезопасен и должен   всегда кодируется, потому что он используется в World Wide Web и в других   системы для разграничения URL-адреса от идентификатора фрагмента/привязки, который может   следуйте за ним. Символ "%" небезопасен, потому что он используется для   кодировки других персонажей. Другие символы небезопасны, потому что   шлюзы и другие транспортные агенты, как известно, иногда изменяют   таких персонажей. Этими символами являются "{", "}", "|", "\", "^", "~",    "[", "]" и "`".

Все небезопасные символы всегда должны быть закодированы в URL-адресе. Для   Например, символ "#" должен быть закодирован в URL-адресах, даже в   системы, которые обычно не обрабатывают фрагмент или якорь   идентификаторы, чтобы URL-адрес был скопирован в другую систему, которая   использует их, нет необходимости изменять кодировку URL.

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

Ответ 6

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

Ответ 7

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

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

Символы "национальный" и "пунктуация" не отображаются ни в одном    и поэтому могут не отображаться в URL-адресах.
national {| } | vline | [| ] |\| ^ | ~
пунктуация < | >

Ответ 8

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

Ответ 9

Квадратные скобки [ и ] в 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).

Ответ 10

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