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

Php 当代理*始终*声明安全连接时检测SSL,php,javascript,https,proxy,Php,Javascript,Https,Proxy,我想检测用户是否正在查看安全页面,如果没有,则重定向(用于登录) 然而,在我看到服务器变量之前,我的站点通过一个代理运行,代理(现在)告诉我,$\u服务器['HTTPS']是'on',而URI明确指出不是这样。当用户“安全地”导航时,它还会显示“on” 在http://和https://中导航都会输出$\u服务器['SERVER\u PORT']=443 我无法对代理进行任何更改,因此我想知道: PHP是否有其他选项可供我检测真相或 我是否坚持求助于JavaScript的检测和重定向机制 我

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

然而,在我看到服务器变量之前,我的站点通过一个代理运行,代理(现在)告诉我,
$\u服务器['HTTPS']
'on'
,而URI明确指出不是这样。当用户“安全地”导航时,它还会显示“on”

http://
https://
中导航都会输出
$\u服务器['SERVER\u PORT']
=
443

我无法对代理进行任何更改,因此我想知道:

  • PHP是否有其他选项可供我检测真相或
  • 我是否坚持求助于JavaScript的检测和重定向机制
我挖掘了一些想法,但它们大多围绕着可信的
$\u服务器['HTTPS']
变量。呸

看起来,他正在经历至少类似的事情,但他/她能够通过采用apache解决方案来解决这个问题

是否有其他PHP服务器变量或技巧可用于检测用户的URI以什么开头?http与https查看我的站点时,$\u服务器变量之间的唯一区别如下:

  • _FCGI_X_管道(随机显示)
  • HTTP_COOKIE(非安全版本中包含sto-id-47873,但我没有将其放在那里)
  • 远程地址(此地址和下两个地址一直在莫名其妙地变化!)
  • 远程主机
  • 远程端口(“代理人员”,为什么要不断更改此端口?)
这些物品中有没有一件足够结实,可以承受一个人的体重,而不会在以后碎裂和疼痛?也许我不应该信任通过代理过滤的任何东西,因为它在任何给定的时间都可能发生变化

以下是我使用JavaScript实现这一目的的计划;这是我最好的吗

function confirmSSL() {
    if(location.protocol != "https:") {
        var locale = location.href;
        locale = locale.replace(/http:\/\//,"https://");
        location.replace(locale);
    }
}
<body onLoad="confirmSSL()">...
函数confirmsssl(){
如果(location.protocol!=“https:”){
var locale=location.href;
locale=locale.replace(/http:\/\/,“https://”);
位置。替换(区域设置);
}
}
...
我认为如果用户在我的社区中禁用了JavaScript,那么他们希望知道自己在做什么。他们应该能够手动进入安全区域。什么样的
建议是常见的/良好的做法?大概是这样吧

使用导航来保护您的信息。

PHP的解决方案,工作(与良好的解释)将优先考虑正确的答案。请随意提交一个更好的JavaScript实现或链接


非常感谢

只需使用客户端方法即可。如果代理是不可配置的,则该选项不可用。通过js进行检测和重定向很好。

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

  • 通常使用
    窗口。建议使用位置
    而不是
    位置
    ,可以找到解释
  • 对于协议的简单替换,Regex似乎有点过分了
  • 应该尽快执行重定向逻辑,因为在重定向的情况下,每个额外的文档处理都是不必要的
  • 禁用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>
        ...
    
    
    如果(window.location.protocol!=“https:”){
    window.location.href=“https:”+window.location.href.substring(window.location.protocol.length);
    }
    ...
    ...
    请单击以使用安全连接!
    ...
    
    还有一种方法可以在不使用客户端javascript的情况下实现重定向。如果在客户端浏览器中禁用JavaScript,则此方法尤其有用。
    这些步骤是纯PHP的,非常简单:

    • 开课
    • 如果是新会话,请重定向到
      https
      位置
    • 如果会话不是新的,可以假定用户已被重定向
    示例代码:

    <?php
        session_start();
        if( !isset($_SESSION['runningOnHttps']) ) {
            $_SESSION['runningOnHttps'] = true;
            header('Location: https://my-cool-secure-site.com');
        }
    ?>
    

    我能想到的唯一一件事是使用
    /^http:\/\/
    作为正则表达式,只是为了确保它与字符串开头的协议匹配(万一它也在其他地方,比如“重定向到”paramI会尽可能将重定向功能放在文档的最上面,或者尽早执行它。它当然不需要等待主体加载。它是什么类型的代理?这听起来很错误,因此如果它没有配置错误,向制造商/项目提交投诉/错误报告将是一个好主意,即使您可以不要改变它。也就是说,确保代理管理员至少知道这个问题——我发现即使在最不喜欢改变的公司环境中,配置更改也会偶尔发生!@veeTrain我会直接把它放在head标签下面,然后立即调用它。我不明白你为什么要将它绑定到一个具体的事件。如果您能够收集一些请求数据,还可以考虑对最可能的情况进行优化输出。如果初始非SSL请求的数量较高,则首先发送只包含一些JS的页面,并将每个人粗暴地重定向到SSL位置将是有益的。她,你总是可以立即发送你的有效载荷,并且只有在必要时才能重定向。谢谢你的鼓励,Geuis!
    if( !isset($_SESSION['checkWasMade']) ) {
        $_SESSION['checkWasMade'] = true;
        echo '<noscript>
                <iframe src="redirect.php" style="visibility: hidden; position: absolute; left: -9000px;"></iframe>
              </noscript>';
    }
    
    // The following echo must appear inside the html head
    if( !isset($_SESSION['checkWasMade']) ) {
       $_SESSION['checkWasMade'] = true;
       echo '<noscript>
                <meta HTTP-EQUIV="REFRESH" content="0; url=https://my-cool-secure-site.com"> 
            </noscript>';
    }