Как браузеры определяют, является ли URL-адрес в href относительным или нет при использовании схемы?
Предположим, у меня есть следующий тег ссылки: <a href="tel:+15555555">Phone number</a>
,
Как именно браузер знает, чтобы не загружать относительное местоположение ./tel:+15555555
с текущего сервера и вместо этого знаю, что tel
предполагается интерпретировать как схему?
Обнаружение относящихся к хосту URL (/…
) или относящиеся к протоколу URL (//…
) кажется тривиальным. Я думаю, HTTP-URL (http://…
или же https://…
) было бы просто в особом случае. Но как браузер выполняет парсинг URL по произвольной схеме? Я знаю, что действительная схема должна начинаться со строчной буквы и может содержать только строчные буквы или символы +
, -
а также .
, что несколько ограничивает область действия... Конечно, я знаю, что вся проблема относится только к областям, где действительны относительные URL-адреса (т.е. в основном href
а также src
атрибуты).
Я ищу ссылки на некоторые RFC (например, запрещающие двоеточия без кодировки быть чем-то иным, кроме разделителей схемы), а также на исходный код различных браузеров для анализа внутренних URL-адресов.
2 ответа
Значение href анализируется как URI (см. RFC 3986). В результате анализа браузер узнает, что это был абсолютный URI, а не относительная ссылка.
На самом деле, unescaped ":" разрешен в компоненте пути; просто они должны появляться после первого "/"; в противном случае они могут быть проанализированы как разделитель схемы, если все предыдущие символы являются допустимыми символами имени схемы.
См. http://greenbytes.de/tech/webdav/rfc3986.html
RFC также имеет следующее, чтобы сказать в разделе 4.2 (под названием "Относительная ссылка"): "Сегмент пути, который содержит символ двоеточия (например, " this:that"), не может использоваться в качестве первого сегмента ссылки на относительный путь, так как это будет ошибочно принято за название схемы. Такому сегменту должен предшествовать точечный сегмент (например, "./this:that"), чтобы сделать ссылку на относительный путь. "(Выделение добавлено).