我已经将运行的网站从标准Apache服务器配置移至基于Docker容器的平台,所有内容都位于(主容器)Nginx反向代理之后。通常,这是简单而无缝的。
但是,我现在正在对异常情况进行故障排除。当前的是另一个Web服务器容器中的PHP会话...
我要做的就是使用“ php:7.2-apache”创建一个docker容器并启用mysqli扩展。此容器指向相同的html / php源位置。
该站点具有以前使用过的使用PHP会话的简单登录功能。 login.php页面具有一个提交给自己的表单。如果user / pass变量位于$ _SESSION变量中,并且与数据库查询匹配,则应将用户重定向到实际的“隐藏” edit.php页面。但是它永远不会到达那里!看着上面的日志文件(由于要解决的另一个问题,我抑制了Warnings日志记录...),执行上述操作会产生login.php页面的返回200。
尝试调试放置print_r($ _ SESSION)语句时,$ _ SESSION为空。
还有其他事情需要我做些或更改以恢复以前的行为吗?在Nginx反向代理后面还会发生什么/表现不同?
login.php代码:
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Website</title>
<!-- Bootstrap -->
<link href="../css/bootstrap.css" rel="stylesheet">
<link href="../css/bootstrap-theme.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script>
$(document).ready(function(){
$('[data-toggle="popover"]').popover();
});
</script>
</head>
<body>
<?php
if(empty($_SESSION)){
print("empty");
}
if(isset($_POST['submit'])){
$theuser = $_POST['username'];
$thepassword = $_POST['password'];
}
if(!empty($_POST)){
$mysqli = new mysqli('mysqlhost','user','pass','db_name');
$query = "SELECT username, password FROM users WHERE username = '$theuser'";
$results = $mysqli->query($query);
$login_ok = false;
while($row = $results->fetch_assoc()) {
if($thepassword === $row['password']){
session_start();
$_SESSION['user'] = $row;
$login_ok = true;
}
}
$results->close();
$mysqli->close();
if ($login_ok) {
header("Location: https://www.website.com/edit.php");
}
else{
print("Login Failed.");
$submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8');
}
}
?>
<div class="container">
more html stuff....
</div>
</body>
在edit.php文件的顶部,我有:
<?php
session_start();
include 'functions.php';
print_r($_SESSION);
if(empty($_SESSION['user']))
{
header("Location: login.php");
die("Redirecting to login.php");
}
?>
但是我不认为我什至可以访问此页面,因为日志中没有任何内容...我所看到的只是从login.php返回的200:
w.x.y.z--[04 / Aug / 2018:09:09:09 +0000]“ POST /login.php HTTP / 1.1” 200889“ https://www.website.com/login.php”“ Mozilla / 5.0(Macintosh; Intel Mac OS X 10_13_4)AppleWebKit / 605.1.15(KHTML,如Gecko) 版本11.1 Safari / 605.1.15“
上面的(w.x.y.x)行中的IP地址是内部Docker网络范围,如果这很重要(?)。 PHP的$ _GET和$ _POST变量可以按预期运行,并包含适当的值。
编辑:附加的故障排除/诊断...
在其他页面和主题中找到详细信息之后,我还检查了其他方面。当我的session.save_path
变量设置为“无值”时,它将写入容器内的/tmp
。我已连接到控制台会话,并验证此目录存在并且其中包含文件。如果这可能有其他问题,我还能或应该做哪些其他检查?
我还可以执行其他哪些测试?我可以启用日志记录吗?等