当代理*始终*声明安全连接时检测SSL

vee*_*ain 6 javascript php https proxy

我想检测用户是否正在查看安全页面,如果没有则重定向(用于登录).

但是,在我看到服务器变量和代理(现在)告诉我这$_SERVER['HTTPS']'on'URI明确指示的情况之前,我的网站通过代理.它还显示'on'用户何时"安全"导航.

导航http://https://输出$_SERVER['SERVER_PORT']= 443.

我没有能力对代理进行任何更改,所以我想知道:

  • PHP有任何其他选择让我发现真相或......
  • 我是否坚持使用JavaScript的检测和重定向机制.

我挖掘这个问题的想法,但他们主要围绕$_SERVER['HTTPS']变量值得信赖.呸!

似乎这个问题至少经历过类似的问题,但是他/她能够通过调整apache解决方案来解决它.

是否有任何其他PHP SERVER变量或技巧可用于检测用户的URI开头的内容?查看我的网站http与https时$ _SERVER变量之间的唯一区别如下:

  • _FCGI_X_PIPE_(随机出现)
  • HTTP_COOKIE(sto-id-47873包含在非安全版本中,但我没有把它放在那里)
  • REMOTE_ADDR(这和接下来的两个一直在莫名其妙地改变!)
  • 远程主机
  • REMOTE_PORT('代理人',你为什么不断改变这个?)

这些物品中的任何一个都足够坚固,可以在不分裂的情况下施加重量并在以后引起疼痛吗?也许我不应该相信通过代理过滤的任何东西,因为它可能在任何给定时间发生变化.

以下是我为此目的使用JavaScript的计划; 这是我最好的吗?

function confirmSSL() {
    if(location.protocol != "https:") {
        var locale = location.href;
        locale = locale.replace(/http:\/\//,"https://");
        location.replace(locale);
    }
}
<body onLoad="confirmSSL()">...
Run Code Online (Sandbox Code Playgroud)

我想如果用户在我的社区中禁用了JavaScript,那么他们希望知道他们在做什么.他们应该能够手动进入安全区域.什么样的<noscript>建议是司空见惯/良好做法?也许是这样的事情:

<noscript>使用https://blah.more.egg/fake导航以保护您的信息.</noscript>

有效的PHP解决方案(有很好的解释)将优先考虑正确的答案.随意提交更好的JavaScript实现或链接到一个.

非常感谢!

MCL*_*MCL 3

尽管已经在问题的评论中进行了部分讨论,但我将总结一些有关 JavaScript 中重定向逻辑的建议:

  1. 一般来说,建议使用window.locationnot 代替,可以在此处location找到解释。
  2. 对于协议的简单替换来说,正则表达式似乎有点过大了。
  3. 重定向逻辑应该尽快执行,因为在重定向的情况下,不需要每次额外的文档处理。
  4. 禁用 JavaScript 的浏览器至少应该显示一条通知,提示用户切换到 https。

我建议使用以下代码(从这里采用),它简短而高效:

<head>
    <script type="text/javascript">
        if (window.location.protocol != "https:") {
            window.location.href = "https:" + window.location.href.substring(window.location.protocol.length);
        }
    </script>
    ...
</head>
<body>
    ...
    <noscript>Please click <a href="https://my-cool-secure-site.com">here</a> to use a secure connection!</noscript>
    ...
Run Code Online (Sandbox Code Playgroud)