Разрешены ли квадратные скобки в URL-адресах?
-
09-06-2019 - |
Вопрос
Разрешены ли квадратные скобки в URL-адресах?
Я заметил , что Apache commons HttpClient (3.0.1) выдает исключение IOException, однако wget и Firefox принимают квадратные скобки.
Пример URL-адреса:
http://example.com/path/to/file[3].html
Мой HTTP-клиент сталкивается с такими URL-адресами, но я не уверен, исправлять ли код или выдавать исключение (как это на самом деле должно быть).
Решение
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, вы должны заглянуть в класс org.apache.commons.httpclient.util.URIUtil, в частности, метод encode (). Используйте его для URI-кодирования URL, прежде чем пытаться получить его.
StackOverflow, похоже, не кодирует их:
Лучше всего, чтобы URL кодировал их, поскольку они явно не поддерживаются всеми веб-серверами. Иногда, даже когда есть какой-то стандарт, не все следуют ему.
Согласно спецификации URL квадратные скобки не являются допустимые символы URL.
Вот соответствующие фрагменты:
" национальный " и " пунктуация " символы не появляются ни в одном продукции и, следовательно, может не отображаться в URL.
национальный {| } | Влайн | [| ] | \ | ^ | ~
пунктуация < | GT &; Р>
Квадратные скобки [
и ]
in 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-адреса.Тот Самый Приложение А это примерно %-encoding
в строке запроса (квадратные скобки как принадлежащие “общие черты” быть %-encoded
).
Квадратные скобки считаются небезопасными, но большинство браузеров правильно их анализируют. Сказав, что лучше заменить квадратные скобки на некоторые другие символы.