Почему значения href метки привязки требуются http://для префикса URL?

<a href="www.stackoverflow.com" target="_blank">click here</a>

Щелкнув ссылку выше на странице HTML сайта, вы попытаетесь заставить пользователя

<site>/index.html/www.stackoverflow.com

Где работает следующее:

<a href="#" onclick="location.href='http://www.stackoverflow.com'; return false;" target="_blank">click here</a>

В чем причина такого поведения?

Ответы

Ответ 1

Существует несколько протоколов: HTTP, HTTPS, FILE, SSH, SSL, FTP. Кроме того, как отметил Джереми, вполне возможно, что на вашем сервере может быть файл с точным именем текста, который вы вводите в HREF.

В принципе, любой текст в href без протокола считается относительным путем, если нет / или протокола.

Ответ 2

Обновление 3/2/2016:

Просто используйте HTTPS для всего, например: https://www.example.com

Paul Irish рекомендует не использовать URL-адреса, относящиеся к протоколу, т.е. //, и рекомендует писать все ссылки, используя https:// - обоснование являются:

Теперь, когда SSL поощряется для всех и не имеет проблем с производительностью, этот метод [относительные URL-адреса протокола] теперь является анти-шаблоном. Если необходимый вам ресурс доступен по протоколу SSL, то всегда используйте ресурс https://.

Предоставление фрагмента запроса по HTTP открывает дверь для атак, таких как недавняя атака Github Man-on-side. Его всегда безопасно запрашивать активы HTTPS, даже если ваш сайт находится на HTTP, однако обратное неверно.


Оригинальное сообщение:

Как указывали другие ответы, в том числе протоколы в URI, важны, потому что в противном случае вы оставите это на случай, как интерпретируется URI. У вас может быть видеофайл MP4, буквально называемый "www.something.com" вместо "video.mp4", или клиент может попытаться получить доступ к вашему сайту через FTP, потому что он неправильно понял протокол.

Как заметил Колинк в комментарии, вы можете полностью опустить http: и просто использовать //, например //www.example.com. Он останавливает ошибки безопасности смешанного содержимого ( "на этой странице есть неустойчивые элементы" ). Он делает это, потому что browers будет извлекать такие активы, как изображения, как если бы эти активы использовали https://, когда пользователь подключается к текущей странице через HTTPS.

Ответ 3

Если вы оставите протокол (http, https, ftp, mailto и т.д.), ссылка будет относиться к URI текущего запроса. Это то же самое, что префикс href с./значением этого каталога.

адресная строка браузера http://domain.com/questions/

<a href="www.stackoverflow.com" становится domain.com/questions/www.stackoverflow.com

<a href="./www.stackoverflow.com "становится domain.com/questions/www.stackoverflow.com


Если вы префикс с/вы получите от корня домена <a href="www.stackoverflow.com" становится domain.com/www.stackoverflow.com


Добавив http://(или любой другой протокол), браузеру известно, что эта ссылка предназначена для внешней к текущей странице. Это абсолютный путь, потому что он содержит протокол и полную информацию о пути.

<a href="http://www.stackoverflow.com" становится http://www.stackoverflow.com

Ссылка также может быть протокол-относительная, чтобы легко избежать ошибок со смешанным контентом.


Кроме того, если вы укажете <base href="http://domain.com/dir/"> в (* он должен быть абсолютным URL-адресом), то все нефиксные префиксы URL-адреса в href= и src= будут основаны на этом базовом URL-адресе вместо текущей страницы.

при условии, что указанная выше строка адреса http://domain.com/questions/ и <base установлена.

<img src="file.jpg" становится http://domain.com/dir/file.jpg <a href="www.stackoverflow.com" становится http://domain.com/dir/www.stacoverflow.com

Ответ 4

Поскольку URL-адрес может содержать любое количество протоколов:

Браузер не знает, имеете ли вы ftp://www.stackoverflow.com, http://www.stackoverflow.com или что-то еще, поэтому вам нужно указать.