我可以将我所有的 http:// 链接更改为 // 吗?

Posted

技术标签:

【中文标题】我可以将我所有的 http:// 链接更改为 // 吗?【英文标题】:Can I change all my http:// links to just //? 【发布时间】:2011-06-17 10:24:47 【问题描述】:

Dave Ward 说,

阅读起来并不轻松,但section 4.2 of RFC 3986 提供了完全限定的 URL,它们完全省略了协议(HTTP 或 HTTPS)。当 URL 的协议被省略时,浏览器将使用底层文档的协议。

简单地说,这些“无协议”的 URL 允许这样的引用在您将要尝试的每个浏览器中工作:

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

起初看起来很奇怪,但这个“无协议”的 URL 是引用第三方内容的最佳方式,可通过 HTTP 和 HTTPS 访问。

这肯定会解决我们在 HTTP 页面上看到的一堆混合内容错误——假设我们的资产可通过 HTTP 和 HTTPS 访问。

这完全跨浏览器兼容吗?还有其他注意事项吗?

【问题讨论】:

我不久前在 IE 博客上读到了这项技术。但是当我尝试它时,它的效果并不好。如果我的网站使用 HTTPS,则浏览器 (Chrome) 仍在使用 HTTP 处理无协议 URL。 警告:切记不要在 HTTP 3xx 重定向中使用无方案 URI! HTTP 标头与此 URL 格式不兼容。如果您需要根据方案重定向,请使用 mod_rewrite 或类似的。 @user2596282 在 Chrome 和 Firefox 的现代版本中进行的实验与 HTTP 1.1 的(仍在草稿中)修订版不同意。 HTTPbis 工作组定义的规范(参见svn.tools.ietf.org/svn/wg/httpbis/draft-ietf-httpbis/latest/…)。不过,也许您所说的某些浏览器是正确的;您是否知道在位置标头中的协议相关 URL 上特别失败? 同样的问题有一些好的答案:Absolute URLs omitting the protocol (scheme) in order to preserve the one of the current page 不要使用它们,它们丑陋且多余。 【参考方案1】:

我在发布之前对其进行了彻底的测试。在 Browsershots 上可用于测试的所有浏览器中,我只能找到一个不能正确处理协议相对 URL 的浏览器:一个名为 Dillo 的不起眼的 *nix 浏览器。

我收到的反馈有两个缺点:

    当您在浏览器中“打开”本地文件时,无协议 URL 可能无法按预期工作,因为该页面的基本协议是 file:///。尤其是当您将无协议 URL 用于外部资源(如 CDN 托管资产)时。不过,使用 Apache 或 IIS 等本地 Web 服务器来测试 http://localhost 地址可以正常工作。 显然,至少有一个 iPhone 提要阅读器应用程序无法正确处理无协议 URL。我不知道哪个有问题或它有多受欢迎。对于托管 javascript 文件,这不是什么大问题,因为 RSS 阅读器通常会忽略 JavaScript 内容。但是,如果您将这些 URL 用于需要通过 RSS 联合的内容中的图像等媒体,则可能会出现问题(尽管,单个平台上的这个单一阅读器应用程序可能只占极少数读者)。

【讨论】:

虽然 IE7/8 在大多数情况下都能很好地处理协议相关的 URL(也称为无方案 URI),但当使用此类 URL 指定样式表时,它将下载它们 两次。 (所以说Steve Souders) 我发现 IE6 试图将 URI 转换为相对的(即删除前导斜杠之一)。这是在 link 元素中。例如,指定//fonts.googleapis.com/css?family=Rokkitt:400,700 时,IE6 会尝试加载http://mysite.com/fonts.googleapis.com/css/<...>。不太好! 我从我的日志中发现似乎是网络蜘蛛机器人的实例(来源未知)试图使用无协议链接但也没有正确处理它们。 我在日志中看到了很多与无协议 URL 无关的内容。很多蜘蛛都写得非常糟糕。 重要的是要了解这些 URL 不是协议-less,而是协议-相对。它们从上下文中获取协议,并且缺少上下文,它们在大多数浏览器中的行为就像文件 url,这实际上意味着它们中断了它们不会加载预期的内容。虽然它们在通过 http 传递时可以工作,但您会发现,如果您保存页面并从本地文件加载完全相同的 html,它们将不会工作,因为上下文不同。您应该使用它们的唯一上下文是 http 与 https。【参考方案2】:

考虑到一个应该是否应该这样做的问题,是否一个可以将其所有链接更改为与协议相关的问题可能没有实际意义。根据Paul Irish:

2014.12.17:现在 SSL 鼓励所有人使用并且不存在性能问题,这种技术现在是一种反模式。如果 您需要的资产在 SSL 上可用,然后始终使用 https:// 资产。

【讨论】:

我的想法完全一样。如果外部资产也可以通过 https 使用,那么通过 http 下载外部资产有什么意义 - 即使主站点使用的是 http(它不应该,但这是另一个主题)。 @joonas.fi 我唯一能想到的就是避免某些浏览器可能生成的混合 HTTP/HTTPS 警告 @Ohad_Schneider 警告仅在文档通过安全 (https) 加载但资产通过不安全 (http) 加载时触发。我的建议是,您始终可以通过安全方式加载资产,即使文档是通过不安全方式加载的。没有警告,也没有理由不使用安全,使整个“协议相对 URL”变得不必要。 @Ohad_Schneider 哦,对不起,我想我误解了你在说什么。当您通过 http 记录文件时,通过 https 加载资产不应产生任何警告。但是当您的文档通过 https 时通过 http 加载资产(并且可能在默认情况下被阻止,至少在 Chrome 中)。您是指通过 https 为您的网站提供服务而外部资产仅在 http 下可用的情况?是的,这可能是个问题,但我认为没有任何严肃的第 3 方服务不通过 h​​ttps 提供他们的内容,否则他们无论如何都应该倒闭。 :) @joonas.fi 什么? O_o 如果某人有 HTTPS 站点(然后)协议相对 URL 将无助于解决通过 HTTP 获取 3rd 方资产的问题——不可能。无论如何,在你的 HTTPS 页面上没有那个干净的绿色 SSL 标志比仅仅因为第 3 方还不支持 HTTPS 而再次放弃它给 HTTP 更好。【参考方案3】:

如果您使用无协议 URL 加载样式表,IE 7 和 8 将下载它们两次: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/

所以,如果你喜欢良好的性能,CSS 应该避免这种情况。

【讨论】:

是的,但是随着 IE 7 和 8 的市场份额缩小,这越来越不能成为避免使用无方案 URL 的理由。【参考方案4】:

是的,RFC 1808 中已经指定了网络路径引用,并且应该适用于所有浏览器。

【讨论】:

它甚至被推荐并用于 HTML5 样板代码:html5boilerplate.com whit 是的,您没有回答“是否还有其他警告?” ? ;) @Caspar Kleijne:我用剩下的句子解释了“是”。 Casper,Gumbo 实际上是在回答提出的两个问题:“这完全跨浏览器兼容吗?还有其他注意事项吗?”是的,是第一个问题的答案。【参考方案5】:

这完全跨浏览器兼容吗?还有其他注意事项吗?

只是把这个混在一起,如果你在本地服务器上开发,它可能行不通。您需要指定一个方案,否则浏览器可能会认为src="//cdn.example.com/js_file.js"src="file://cdn.example.com/js_file.js",由于您没有在本地托管此资源,因此会中断。

Microsoft Internet Explorer 似乎对此特别敏感,请参阅此问题:Not able to load jQuery in Internet Explorer on localhost (WAMP)

您可能总是会尝试找到一种适用于所有环境且所需修改最少的解决方案。

HTML5Boilerplate 使用的解决方案是在资源未正确加载时进行回退,但这只有在您合并检查时才有效:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- If jQuery is not defined, something went wrong and we'll load the local file -->
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.10.2.min.js"><\/script>')</script>

我也发布了这个答案here。

更新:HTML5Boilerplate 在决定弃用协议相关 URL 后现在使用 &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"&gt;,请参阅 here。

【讨论】:

【参考方案6】:

我在使用 ://domain.com 时没有遇到这些问题 - 但您确实需要在开头添加冒号。不久前,Yoast 写了一篇很好的文章。但这在他的一堆博文中消失了。

【讨论】:

否决了没有说明附加 : 有用的地方。我不小心留下“:”的所有地方都断开了链接【参考方案7】:

如果您想确保所有请求都升级到安全协议,那么有一个简单的选项可以使用内容安全策略标头 upgrade-insecure-requests

Content-Security-Policy: upgrade-insecure-requests;

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests

【讨论】:

以上是关于我可以将我所有的 http:// 链接更改为 // 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Android Studio 将我所有的引用从 R 更改为 android.R?

如何将我的网址更改为用户友好的网址 [重复]

如何将我在 iTunes 中的应用更改为我所在国家/地区的特定连接?

我可以随时将我的应用程序从免费更改为付费或从付费更改为免费吗?

Wordpress Woocommerce 将所有产品更改为缺货

在编辑超链接单击时将标签更改为文本框