Что означает "нечувствительность к регистру" в RFC 3986 в отношении неанглийских символов?

RFC 3986 указывает, что компонент хоста URI является "нечувствительным к регистру" . Однако он не указывает, что означает "нечувствительность к регистру" в терминах символов UCS или UTF-8.

Примеры, приведенные в RFC (например, "<HTTP://www.EXAMPLE.com/ > эквивалентно <HTTP://www.EXAMPLE.com/ > " ), позволяют сделать вывод о том, что "нечувствительность к регистру" означает по крайней мере, что символы AZ считаются эквивалентными символу 32 перед ними в наборе символов UTF-8, т.е. az. Однако не упоминается, как следует обращаться с персонажами за пределами этого диапазона. Поэтому, учитывая некодированное ненормированное зарегистрированное имя www.OLÉ.com, я вижу три возможных формы нормализации, допустимых RFC:

  • Нижний регистр на www.olé.com, затем процентный код на www.ol% E9.com
  • В нижнем регистре только символы A-Z на www.olÉ.com, а затем процентное кодирование на www.ol% C9.com
  • Процент кодируется на www.OL% C9.com, а затем затушевывает незапрошенные закодированные части на www.ol% C9.com, производя тот же результат, что и 2.

Итак, вопрос: что правильно? Если это случай 1. то, что определяет, какие символы считаются верхним регистром и которые рассматриваются в нижнем регистре (а какие символы не имеют случая)?

+5
источник поделиться
1 ответ

Hostnames разрешено DNS всегда строчными.

невозможно иметь символы UTF-8 в именах хостов DNS (RFC 1123), однако обходной путь был применен с "интернационализированные доменные имена". Это обходное решение обычно называется punycode.

Punycode позволяет без символов ASCII быть представленными символами ASCII.

символы, отличные от ASCII, представлены символами ASCII, которые разрешены в метках имени узла (буквы, цифры и дефисы).

- https://www.ietf.org/rfc/rfc3492.txt

Что касается примера, который вы указали в своем вопросе (www.olé.com), доменное имя, которое будет разрешено, не является www.ol% E9.com.

Если вы получаете процентные знаки в своем доменном имени, это означает, что у вас есть URL-кодированное имя хоста, и это неверно, по крайней мере, не для разрешения.

Например, он будет корректно работать с тегом a, который выглядит следующим образом:

<a href="//www.ol%C3%A9.com">Click Here</a>

Однако DNS-сервер не будет разрешать www.ol%C3%A9.com, а скорее преобразованное имя домена как punycode:

Пример

www.ol%C3%A9.com

становится

www.olé.com

который в punycode переводит на:

www.xn--ol-cja.com

Веб-браузеры обычно конвертируют символы верхнего регистра в нижнюю регистрационную строку. Например, как www.olé.com, так и www.olÉ.com переводятся на одно и то же имя хоста DNS (www.xn--ol-cja.com), потому что www.olÉ.com было уменьшено до www.olé.com.

Я рекомендую два инструмента для проверки имен доменов IDN, чтобы увидеть, как выглядит доменное имя, когда оно проходит через перевод punycode:

Инструмент Verisign IDN намного более строгий. Попробуйте оба инструмента с www.olÉ.com в качестве ввода, чтобы увидеть, что я имею в виду.

Правила IDNA (интернационализированные имена доменов для приложений) сложны, но есть два основных RFC, которые стоит посмотреть на:

  • Интернационализированные имена доменов для приложений (IDNA): справочная информация, пояснение и обоснование
    https://tools.ietf.org/html/rfc5894
  • Кодовые точки Юникода и интернационализированные имена доменов для приложений
    https://tools.ietf.org/html/rfc5892

rfc5894 раздел 3.1.3 указывает, что символы могут быть недопустимы, если:

  • Символ - это форма в верхнем регистре или какая-либо другая форма, которая  сопоставленному с другим символом с помощью свертки в Unicode.
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос