Разрешены ли квадратные скобки в URL-адресах?
Я заметил, что Общий доступ Apache HttpClient (3.0.1) выдает исключение IOException, wget и Firefox, однако принимают квадратные скобки.
Пример URL:
http://example.com/path/to/file[3].html
Мой HTTP-клиент встречает такие URL-адреса, но я не уверен, исправлять ли код или генерировать исключение (как на самом деле должно быть).

Лучше всего закодировать их в URL-адресах, поскольку они явно не поддерживаются на всех веб-серверах. Иногда, даже когда есть стандарт, не все им следуют.
Практически единственными символами, которые нельзя использовать в именах путей, являются # и? поскольку они означают конец пути.
У uri rfc будет окончательный ответ:
http://www.ietf.org/rfc/rfc1738.txt
Unsafe:
Characters can be unsafe for a number of reasons. The space character is unsafe because significant spaces may disappear and insignificant spaces may be introduced when URLs are transcribed or typeset or subjected to the treatment of word-processing programs. The characters "<" and ">" are unsafe because they are used as the delimiters around URLs in free text; the quote mark (""") is used to delimit URLs in some systems. The character "#" is unsafe and should always be encoded because it is used in World Wide Web and in other systems to delimit a URL from a fragment/anchor identifier that might follow it. The character "%" is unsafe because it is used for encodings of other characters. Other characters are unsafe because gateways and other transport agents are known to sometimes modify such characters. These characters are "{", "}", "|", "\", "^", "~", "[", "]", and "`".
All unsafe characters must always be encoded within a URL. For example, the character "#" must be encoded within URLs even in systems that do not normally deal with fragment or anchor identifiers, so that if the URL is copied into another system that does use them, it will not be necessary to change the URL encoding.
Ответ в том, что они должен закодированы в шестнадцатеричном формате, но, зная закон постела, большинство вещей примет их дословно.
Все небезопасные символы ДОЛЖНЫ всегда кодироваться в URL. ОБЯЗАТЕЛЬНО, а не ОБЯЗАТЕЛЬНО.
Согласно Спецификация URL, квадратные скобки не являются допустимыми символами URL.
Вот соответствующие фрагменты:
The "national" and "punctuation" characters do not appear in any productions and therefore may not appear in URLs.
national { | } | vline | [ | ] | \ | ^ | ~
punctuation < | >
Любой браузер или программное обеспечение с поддержкой Интернета, которое принимает URL-адреса и не генерирует исключение при вводе специальных символов, почти гарантированно закодирует специальные символы за кулисами. Фигурные скобки, квадратные скобки, пробелы и т. д. Имеют специальные закодированные способы их представления, чтобы не создавать конфликтов. Согласно предыдущим ответам, самый безопасный способ справиться с ними - это URL-кодировать их, прежде чем передавать их тому, что попытается разрешить URL-адрес.
Это верно для пробелов и других специальных символов, но не для квадратных скобок. Когда я ввожу example.com/?a inventory=1 в адресной строке, я увидел квадратную скобку, отправленную без экранирования в HTTP.
Для использования общего класса HttpClient вы хотите изучить класс org.apache.commons.httpclient.util.URIUtil, в частности метод encode (). Используйте его для URI-кодирования URL-адреса перед попыткой его получения.
RFC 3986 состояния
A host identified by an Internet Protocol literal address, version 6 [RFC3513] or later, is distinguished by enclosing the IP literal within square brackets ("[" and "]"). This is the only place where square bracket characters are allowed in the URI syntax.
Таким образом, вы не должны видеть такие URI в теории, поскольку они должны поступать в закодированном виде.
Я знаю, что этот вопрос немного устарел, но я просто хотел отметить, что PHP использует скобки для передачи массивов в URL-адресе.
http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3
В этом случае $_GET['bar'] будет содержать array(1, 2, 3).
Верно, но они все равно должны быть закодированы, если браузер не делает этого автоматически. PHP по-прежнему будет правильно интерпретировать скобки, и его собственная функция http_build_query () также их кодирует.
StackOverflow, похоже, их не кодирует:
https://stackoverflow.com/search?q=square+brackets+[url]
Я считаю, что вы видите, что ваш браузер принимает их в качестве входных данных. Однако, если вы щелкнете одну из вкладок на странице результатов Stackoverflow, скобки будут закодированы ... search? Tab = newest & q = square% 20brackets% 20% 5burl% 5d
Квадратные скобки считаются небезопасными, но большинство браузеров правильно их разбирают. При этом квадратные скобки лучше заменить другими символами.
Квадратные скобки [ и ] в URL-адресах поддерживаются нечасто.
%5B и %5D:Следующий пример с использованием командной строки основан на bash и sed:
url='http://example.com?day=[0-3][0-9]'
encoded_url = "$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
Использование 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).
Firefox показывает вам удобный URL-адрес в адресной строке, но фактически отправляемый URL-адрес содержит закодированные специальные символы.