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,但我没有将其放在那里)
- 远程地址(此地址和下两个地址一直在莫名其妙地变化!)
- 远程主机
- 远程端口(“代理人员”,为什么要不断更改此端口?)
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重定向逻辑的建议:
窗口。建议使用位置
而不是位置
,可以找到解释<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>';
}