Почему значения 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 или что-то еще, поэтому вам нужно указать.