使用 JavaScript 检测 HTTPS [重复]

Posted

技术标签:

【中文标题】使用 JavaScript 检测 HTTPS [重复]【英文标题】:Detect HTTPS with JavaScript [duplicate] 【发布时间】:2011-02-20 18:46:46 【问题描述】:

如果我在 HTTP 或 HTTPS 环境中,我正在尝试查找如何使用 javascript 进行检测。

我正在调用一个 Ajax 请求,所以如果我使用 HTTPS 并调用 HTTP Ajax,那么我会得到一个 302 Moved Temporarily。

我正在考虑获取当前的window.location.href 并进行字符串操作。

使用 JavaScript 检测 HTTPS 的最佳方法是什么?

【问题讨论】:

@DanDascalescu 您是否使用“标志”将其标记为重复项? @HackerKarma:我在三周前投票决定关闭。什么都没发生,然后我才使用了标志。 @DanDascalescu 谢谢。我只是将其标记为关闭。让我们看看会发生什么。 @HackerKarma:阅读您的评论后,我没有看到任何接近的投票(看起来我的被删除了 - 我不明白如何或为什么)。我刚刚再次投票关闭,仍然看到“关闭(1)”,这表明您的投票也已被删除?编辑:刚刚注意到你的代表是 394。你可以投接近票吗? @DanDascalescu 抱歉,我的意思是把它标记为“重复” 【参考方案1】:

这个怎么样?

 var protocol = window.location.href.indexOf("https://")==0?"https":"http";

【讨论】:

应该是protocol = window.location.href.indexOf("https://")==0?"https":"http";【参考方案2】:

在许多情况下,可以完全省略协议。所以,而不是

<img src="https://test.com/image.jpg" />

可以使用

<img src="//test.com/image.jpg" />

然后浏览器会自动添加当前协议。这也适用于在头部包含文件,它也适用于 ajax 调用。

编辑:现在这样做被认为是一种反模式:

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

允许 sn-p 通过 HTTP 请求为最近的 Github Man-on-the-side 攻击等攻击打开了大门。即使您的网站使用 HTTP,请求 HTTPS 资产始终是安全的,但反之则不然。

见:http://www.paulirish.com/2010/the-protocol-relative-url/

【讨论】:

确认这确实适用于 ajax 调用......至少对于 AngularJS $http.get('//example.com') 我遇到的一个警告是,在将代码部署到移动设备后(如果您使用的是 Cordova 或 PhoneGap),此答案将不起作用。在这种情况下 // 将解析为 file:// 所以你永远不能将它用于 http 调用。如果您不是为移动开发,请忽略这一点。【参考方案3】:

有一个非常简洁的库,叫做 URI 来处理这样的事情。 https://github.com/medialize/URI.js

您可能不需要它来获取协议,但如果您要对 URI 进行字符串操作,则应该使用它。

【讨论】:

【参考方案4】:

location.protocol 适用于所有浏览器。

【讨论】:

浏览器不止两个 :) 哎哟!谢谢你让我回到现实:)【参考方案5】:

看看谷歌分析如何将他们的脚本添加到页面:

ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';

那么 document.location.protocol 对所有浏览器来说似乎都是安全的。

【讨论】:

伟大的洞察力。完美运行。【参考方案6】:

你可以使用非标准的

window.location.protocol 

在 Firefox 中:MDC documentation

在IE中,好像是

 document.location.protocol

MSDN documentation

我找不到关于它在其他浏览器上的表现的可靠信息,但我希望它们遵守document.location.protocol 的准标准。

也许jQuery url plugin 可以解决这个问题,而无需处理跨浏览器的差异 - 我自己从未使用过它,但它看起来很有希望:

jQuery.url.attr("protocol");

【讨论】:

+1:这是更通用的方式 :)

以上是关于使用 JavaScript 检测 HTTPS [重复]的主要内容,如果未能解决你的问题,请参考以下文章

检测 HTTP 或 HTTPS,然后在 JavaScript 中强制使用 HTTPS

使用 JavaScript 检测 HTTPS [重复]

Javascript/jquery:如何检测在其他窗口或应用链接中加载的页面?

如何在 Android Web 视图中检测重定向

无法通过JavaScript函数重定向HTML页面

javaScript使用技巧