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