Разрешены ли квадратные скобки в URL? - PullRequest
33 голосов
/ 03 сентября 2008

Разрешены ли квадратные скобки в URL?

Я заметил, что Apache commons HttpClient (3.0.1) выбрасывает IOException, wget и Firefox, однако принимают квадратные скобки.

Пример URL:

http://example.com/path/to/file[3].html

Мой HTTP-клиент встречает такие URL-адреса, но я не уверен, исправлять ли код или выдавать исключение (как это и должно быть).

Ответы [ 10 ]

38 голосов
/ 19 июня 2009

RFC 3986 состояния

Хост, идентифицированный через Интернет Протокол буквального адреса, версия 6 [RFC3513] или более поздняя версия заключив IP-литерал в квадратные скобки ("[" и "]"). это это единственное место, где квадратная скобка символы разрешены в URI синтаксис.

Таким образом, вы не должны видеть такие URI в теории, так как они должны быть закодированы.

8 голосов
/ 12 ноября 2009

Я знаю, что этот вопрос немного устарел, но я просто хотел отметить, что PHP использует скобки для передачи массивов в URL.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

В этом случае $_GET['bar'] будет содержать array(1, 2, 3).

5 голосов
/ 03 сентября 2008

Любой браузер или веб-программное обеспечение, которое принимает URL-адреса и не выдает исключение, когда вводятся специальные символы, почти гарантированно кодирует специальные символы за кулисами. В фигурных скобках, квадратных скобках, пробелах и т. Д. Есть особые закодированные способы их представления, чтобы не вызывать конфликтов. Согласно предыдущим ответам, самый безопасный способ справиться с ними - это закодировать их по URL, прежде чем передать их чему-то, что попытается разрешить URL.

4 голосов
/ 03 сентября 2008

Практически единственными символами, которые не допускаются в путевых именах, являются # и? как они обозначают конец пути.

Uri rfc будет иметь определяющий ответ:

http://www.ietf.org/rfc/rfc1738.txt

Опасное:

Символы могут быть небезопасными по ряду причин. Космос символ небезопасен, потому что значительные пробелы могут исчезнуть и незначительные пробелы могут быть введены, когда URL транскрибируются или набирают или подвергают обработке текстовые программы. Символы «<» и «>» небезопасны, поскольку они используются в качестве разделители вокруг URL в свободном тексте; знак кавычки ("" ") используется для Разделяйте URL-адреса в некоторых системах. Символ "#" небезопасен и должен всегда кодируется, потому что он используется в World Wide Web и в других системы для отделения URL-адреса от идентификатора фрагмента / якоря, который может следуй за этим. Символ "%" небезопасен, потому что он используется для кодировки других символов. Другие персонажи небезопасны, потому что Известно, что шлюзы и другие транспортные агенты иногда изменяют такие персонажи. Это символы "{", "}", "|", "\", "^", "~", "[", "]" и "` ".

Все небезопасные символы всегда должны быть закодированы в URL. За Например, символ "#" должен быть закодирован в URL даже в системы, которые обычно не имеют дело с фрагментом или якорем идентификаторы, так что если URL-адрес копируется в другую систему, которая действительно использует их, нет необходимости менять кодировку URL.

Ответ в том, что они должны быть закодированы в шестнадцатеричном формате, но, зная закон Постела, большинство вещей примут их дословно.

2 голосов
/ 14 июня 2010

StackOverflow, кажется, не кодирует их:

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

2 голосов
/ 16 сентября 2008

Чтобы воспользоваться классом HttpClient commons, вам нужно заглянуть в класс org.apache.commons.httpclient.util.URIUtil, в частности, метод encode (). Используйте его для URI-кодирования URL, прежде чем пытаться получить его.

1 голос
/ 04 июля 2017

Квадратные скобки [ и ] в 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).

1 голос
/ 03 сентября 2008

Согласно спецификации URL квадратные скобки не являются допустимыми символами URL.

Вот соответствующие фрагменты:

Символы "национальный" и "пунктуация" не отображаются ни в одном продукты и, следовательно, могут не отображаться в URL.
национальный {| } | Влайн | [| ] | \ | ^ | ~
пунктуация <| >

1 голос
/ 03 сентября 2008

Лучше всего кодировать их URL, поскольку они явно не поддерживаются всеми веб-серверами Иногда, даже когда есть какой-то стандарт, не все следуют ему.

0 голосов
/ 02 августа 2016

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

...