缺少http(s)前缀的Href链接

53

我刚刚创建了一个原始的HTML页面。这是它的链接:示例。以下是它的标记:

<a href="www.google.com">www.google.com</a>
<br/>
<a href="http://www.google.com">http://www.google.com</a>

正如您所看到的,它包含两个链接。第一个链接的 href 没有 'http' 前缀,当我点击这个链接时,浏览器会将我重定向到不存在的页面 https://fiddle.jshell.net/_display/www.google.com。第二个链接的 href 有这个前缀,浏览器会生成正确的 url http://www.google.com/。是否可能使用诸如 www.something.com 这样没有 http(s) 前缀的 href?


将“http://”添加到不包含该协议的URL中,可以使用以下代码:url = "example.com" if not url.startswith("http"): url = "http://" + url这将检查URL是否以“http”开头。如果没有,则在URL前面添加“http://”。现在,URL将始终包含协议。 - Francisco Kahil
4个回答

97

这是可能的,实际上你正在做它。它只是并不会做你想象中的那样。

当你链接到这个时,请考虑浏览器所做的事情:

href="index.html"

如果你链接到这个页面,它会做什么呢?

href="index.com"

还是这个呢?:

href="www.html"

或者?

href="www.index.com.html"
浏览器并不知道你的意图,它只知道你告诉了它什么。没有前缀,浏览器会遵循当前 HTTP 地址的标准。前缀是告诉浏览器需要从一个全新的根地址开始的东西。
请注意,你不必须使用http:部分,你可以这样做:
href="//www.google.com"
浏览器将使用当前的协议(httphttps等),但 // 告诉它这是一个新的根地址。

//告诉浏览器,使用相同的协议(http、https等)来加载资源,而不管当前页面使用的协议是什么。


2
“浏览器将使用当前协议”是什么意思?当我在仅支持http的URL上执行此操作时,它会在https中打开,这很不幸无法正常工作。有没有解决方法? - Zeeshan Adil
1
@ZeeshanAdil:当前的协议是用来打开包含被点击链接的页面。因此,如果页面通过HTTP访问,链接将默认为该协议,除非另有指定。如果页面通过HTTPS访问,链接将默认为该协议,除非另有指定。解决这个问题的方法是在链接中指定所需的协议,以确保它是特定的。 - David
1
在HTML文档中提到了“//”,但我找不到任何关于它的信息(但它确实有效)。 - Ruokki

63
您可以通过在路径前面使用//来省略协议。这是一个例子:

<a href="//example.com">Link</a>

<a href="//www.google.com">Google</a>

通过使用//,您可以告诉浏览器这实际上是一个新的(完整的)链接,而不是相对于当前链接的相对链接。


9
另外,如果您的网站使用https运行,则链接也将是https,如果您的网站使用http运行,则链接将是http。 - Rudey

14

我在 React 项目中创建了一个小函数,可以帮助你:

const getClickableLink = link => {
    return link.startsWith("http://") || link.startsWith("https://") ?
      link
      : `http://${link}`;
  };

你可以这样实现它:

const link = "google.com";
<a href={getClickableLink(link)}>{link}</a>

-2
在编写代码时,仅在路径前使用 // 而省略协议是一种非常不利于 SEO 的做法。尽管大多数现代浏览器都可以正常工作,但大多数机器人在扫描您的网站时将会遇到麻烦。Majestic 将不会统计来自这些链接的流量。像 SEMrush 这样的审计工具也无法执行其工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接