使用 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