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

Reg*_*ser 278 javascript https window.location

有没有办法检测HTTP或HTTPS,然后强制使用HTTPS与JavaScript?

我有一些代码用于检测HTTP或HTTPS,但我不能强制它使用https:.

我正在使用window.location.protocol属性来设置站点的任何内容,https:然后刷新页面以希望重新加载加载到浏览器中的新https'ed URL.

if (window.location.protocol != "https:") {
   window.location.protocol = "https:";
   window.location.reload();
}
Run Code Online (Sandbox Code Playgroud)

Sou*_*mya 456

试试这个

if (location.protocol != 'https:')
{
 location.href = 'https:' + window.location.href.substring(window.location.protocol.length);
}
Run Code Online (Sandbox Code Playgroud)

  • 字符串比较应该是`!==`? (10认同)
  • @webjay请参阅http://stackoverflow.com/a/2431375/228534和http://stackoverflow.com/a/12098898/228534 (5认同)
  • @WesTurner没关系。它们都总是字符串。如果一个是数字或布尔值,则可能会有所不同。 (5认同)
  • 在这种情况下,“ location.replace(url)”要比“ location.href = url”好得多。您不希望这种重定向出现在浏览器的历史记录中,也不希望用户单击后退按钮只是为了再次重定向。 (5认同)
  • 为什么`窗口`而不是`文件`? (3认同)
  • 我喜欢使用:`if (window.location.protocol == "http") window.location.href = "https" + window.location.href.slice(4);` (2认同)
  • @zondo 恐怕这不是字符串相等的工作方式。它检查两个字符串是否完全相同。因此,当`window.location.protocol` 为`http:` 时,它将不等于`http`,因此代码无法按预期工作。根据 [MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLHyperlinkElementUtils/protocol),则 `window.location.protocol` 在协议名称后包含冒号。还要注意,域名根本没有存储在`window.location.protocol`中,因此它不会以任何方式用于比较。 (2认同)
  • 应该指出的是,未来的协议可能会存在,就像 https 曾经不存在但现在已成为标准一样。因此,检查其不是 https 并强制为 https 与检查其 http 并强制为 https 不同(这也是问题所问的)。假设 2026 年存在一些协议,例如 httpz,并且更加标准,并且服务器规则自动将用户路由到该协议,现在我们将迫使他们回到旧的 https 协议,除非我们到处更新我们的 JS。最好只检查协议 = http,然后重定向到 https。未来更安全 (2认同)

sam*_*sam 51

设置location.protocol导航到新URL.无需解析/切片.

if (location.protocol !== "https:") {
  location.protocol = "https:";
}
Run Code Online (Sandbox Code Playgroud)

Firefox 49有一个可以工作的错误,httpshttps:没有.据说在Firefox 54中修复.

  • `if window.location.href.match('http:')window.location.href = window.location.href.replace('http','https')`适用于最新的FF和Chrome. (2认同)
  • `location.protocol ="https";`似乎在firefox 28中工作 (2认同)
  • 废话,破坏了后退按钮。请改用“location.replace”。 (2认同)

b1_*_*b1_ 20

这不是一个好主意,因为您只是临时将用户重定向到https,浏览器不保存此重定向.

您描述了web-server(apache,nginx等)http 301,http 302的任务

  • 同意.在服务器上强制https更可靠 (3认同)
  • 如果保留哈希值很重要,我可以看到它被使用.它不会发送到服务器,某些浏览器不会保留它. (3认同)
  • 虽然这样做在客户端通常不是一个好主意,但这并不是所要的。而且您没有显示如何做,因此这不是答案。同样,在如今的静态网页中,通常没有办法在服务器端执行此操作(请考虑使用Github页面),这意味着您必须在客户端上执行此操作。不过,您可以通过添加规范的链接标签来避免人们点击非ssl版本来帮助改进搜索。 (2认同)

kei*_*rog 15

这个怎么样?

if (window.location.protocol !== 'https:') {
    window.location = 'https://' + window.location.hostname + window.location.pathname + window.location.hash;
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,您可以在服务器端执行此操作.


小智 13

if (location.protocol == 'http:')
  location.href = location.href.replace(/^http:/, 'https:')
Run Code Online (Sandbox Code Playgroud)


Ita*_*uel 7

您应该检查一下:https : //developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests

将此标记添加到您的 index.html 内head

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助。


Mik*_*mus 5

不是用 Javascript 的方式来回答这个问题,但如果你使用 CloudFlare,你可以编写页面规则,将用户更快地重定向到 HTTPS,而且它是免费的。在 CloudFlare 的页面规则中看起来像这样:

在此处输入图片说明