Вопрос

Разрешены ли квадратные скобки в 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, похоже, не кодирует их:

https://stackoverflow.com/search?q=square+brackets+[url]

Лучше всего, чтобы 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).

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top