目前我的服务器上已包含SSL。想通过https强制我的用户使用登录页面登录。
<?php
if (empty($_SERVER['https']) || $_SERVER['https'] != 'on') {
header('location: https://my_login_page');
exit();
}
# rest of code
...
但是当没有SSL时,这是一个问题。
现在我有情况。用户请求关注URL
http://domain.com/login.php
在这里,我无法访问$_SERVER['https']
,并希望确保可以将用户重定向到
https://domain.com/login.php
例如,SSL证书在一段时间后过期,并且希望保持用户使用登录w / out安全连接。
我的目标是这样的例子:
if (ssl_installed() && (empty($_SERVER['https']) || $_SERVER[] != 'on')) {
header('location: https://domain.com/login.php');
exit();
}
# when there's no SSL it continues using HTTP
是的,想写函数(例如:ssl_installed()
),当可能使用安全连接时返回true
,否则false
。
我已尝试使用get_headers()
并意识到它始终会针对https://
个链接返回false。
可能的解决方案:
我已经有了解决方案。我的数据库中的配置表包含行ssl=1
(或0),并且在建立数据库连接之后,我使用此值来决定是否可以使用SSL,并且上面提到的函数使用此值返回结果。
我的问题是:是否有更简单的解决方案?
要明确:我正在寻找PHP-ONLY SOLUTION(自动检测)!
任何帮助都将不胜感激。
答案 0 :(得分:5)
您可以在配置文件中执行类似的操作,而不是编辑每个脚本。
<?php
// will match /login.php and /checkout.php as examples
$force_ssl = preg_match('/\/(login|checkout)\.php(.+)?/', $_SERVER['REQUEST_URI']);
$using_ssl = (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) ? true : false;
$url = $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
if ($force_ssl && !$using_ssl) {
// redirect to SSL
header('Location: https://' . $url);
} elseif (!$force_ssl && $using_ssl) {
// redirect back to normal
header('Location: http://' . $url);
}
然后,如果您的证书过期,只需在配置文件中将$force_ssl
设置为false
,它就会处理以前重定向的每个脚本。
现在问题已经澄清,您可以创建这样的PHP脚本(代码取自https://stackoverflow.com/a/4741196/654678)
<?php
// get and check certificate
$get = stream_context_create(array("ssl" => array("capture_peer_cert" => TRUE)));
$read = stream_socket_client("ssl://www.google.com:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $get);
$cert = stream_context_get_params($read);
$valid = ($cert["options"]["ssl"]["peer_certificate"] != NULL) ? true : false;
// save validity in database or somewhere else accessible
然后设置一个crontab,或每日任务或每天点击该PHP脚本的任何内容。如果没有证书,它将返回NULL并被标记为无效。用脚本检查有效性,你就可以了。
答案 1 :(得分:1)
我认为你可以用htaccess来解决这个问题,这两个条件可能会有所帮助
有关详细信息,请参阅此答案:https://stackoverflow.com/a/1128624/1712686
答案 2 :(得分:0)
/**
* Return true if HTTPS enabled otherwise return false
*/
function check_ssl() {
if ( isset( $_SERVER['HTTPS'] ) ) {
if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) {
return true;
} elseif ( '1' == $_SERVER['HTTPS'] ) {
return true;
}
}
if ( isset( $_SERVER['SERVER_PORT'] )
&& ( '443' == $_SERVER['SERVER_PORT'] )
) {
return true;
}
return false;
}