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

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

Я заметил, что Apache commons 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 в теории, так как они должны быть закодированы.

Квадратные скобки [ а также ] в 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 в строке запроса (скобки как принадлежащие "gen-delims", чтобы быть %-encoded).

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

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

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

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

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

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

Опасное:

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам