Разрешены ли квадратные скобки в 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.
Ответ заключается в том, что они должны быть закодированы в шестнадцатеричном формате, но, зная закон о посте, большинство вещей будет принимать их дословно.
Ответ 5
StackOverflow, похоже, не кодирует их:
https://stackoverflow.com/search?q=square+brackets+[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
Квадратные скобки считаются небезопасными, но большинство браузеров правильно разбирают их. Сказав, что лучше заменить квадратные скобки другими символами.