PHP7.2.7-fpm/Docker ini_set(): Headers 已发送。您目前无法更改 session 模块的 ini 设置
PHP7.2.7-fpm/Docker ini_set(): Headers already sent. You cannot change the session module's ini settings at this time
我正在尝试建立一个安全的登录页面,它在使用 XAMPP 时运行良好,但现在我已切换到 Docker,我收到此错误:
Warning: ini_set(): Headers already sent. You cannot change the session module's ini settings at this time in /var/www/inc/cUser.php on line 30
我不确定,我是否需要对容器本身进行一些设置,目前我还没有找到解决方案
我从表单中获取 $_POST 数据并将其传递到我的 process.php:
require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
$user = new cUser();
$user -> sec_session_start();
cUser.php:
protected function sec_session() {
define("SECURE", true);
$session_name = 'sec_session_id';
$secure = SECURE;
$httponly = true;
if (ini_set('session.use_only_cookies', 1) === FALSE) {
//header("Location: /error.php?err=Could not initiate a safe session (ini_set)");
// here i got the same error twice, so i commented it out and used the code below
echo("<script>location.href = /error.php?err=Could not initiate a safe session (ini_set);</script>");
exit();
}
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
session_name($session_name);
session_start();
session_regenerate_id();
}
以上工作正常,我回到我的 process.php:
if ($login) {
// Login successful
exit(header('Location: /index.php'));
} else {
// Login not successful
exit(header('Location: /error.php?error=1'));
}
我成功重定向到 index.php。在我的 index.php 中,我再次调用相同的方法,以确保我拥有正确的用户并有权查看页面:
require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
$user = new cUser();
$user -> sec_session_start();
现在我无意中发现了这个错误。这是行:
if (ini_set('session.use_only_cookies', 1) === FALSE) {
我不确定这里有什么问题,有人可以帮我吗?
我认为理解 什么 导致 Headers already sent
错误很关键,这样才能查明你的错误是什么。
当有人请求网页时,发送任何形式的HTML之前页面的第一位是一组header。这些键值对包含有关页面的关键信息,例如状态代码(200 表示成功,404 表示未找到等)。
它还包含 cookie 信息,这是 PHP 会话如何工作的关键(我怀疑您可能知道您正在执行的命令)。
由于 header 是在请求开始时发送的,如果您将 any 输出到与 header 无关的页面(即使是 <?php
标签之外的换行符)这将阻止发送任何额外的 header 并抛出您看到的错误。
鉴于您看到的症状(这以前有效,但在 Docker 中无效),最可能的原因是在错误报告方面存在配置差异(错误报告在Docker 容器设置为高于 XAMPP) 或 PHP 版本(可能在 Docker 容器中使用更新版本的 PHP你在 XAMPP).
None 您发布的代码看起来应该是错误的,所以我假设这个潜在的错误发生在您的 autoloader.php
文件中。
我正在尝试建立一个安全的登录页面,它在使用 XAMPP 时运行良好,但现在我已切换到 Docker,我收到此错误:
Warning: ini_set(): Headers already sent. You cannot change the session module's ini settings at this time in /var/www/inc/cUser.php on line 30
我不确定,我是否需要对容器本身进行一些设置,目前我还没有找到解决方案
我从表单中获取 $_POST 数据并将其传递到我的 process.php:
require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
$user = new cUser();
$user -> sec_session_start();
cUser.php:
protected function sec_session() {
define("SECURE", true);
$session_name = 'sec_session_id';
$secure = SECURE;
$httponly = true;
if (ini_set('session.use_only_cookies', 1) === FALSE) {
//header("Location: /error.php?err=Could not initiate a safe session (ini_set)");
// here i got the same error twice, so i commented it out and used the code below
echo("<script>location.href = /error.php?err=Could not initiate a safe session (ini_set);</script>");
exit();
}
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams["lifetime"],
$cookieParams["path"],
$cookieParams["domain"],
$secure,
$httponly);
session_name($session_name);
session_start();
session_regenerate_id();
}
以上工作正常,我回到我的 process.php:
if ($login) {
// Login successful
exit(header('Location: /index.php'));
} else {
// Login not successful
exit(header('Location: /error.php?error=1'));
}
我成功重定向到 index.php。在我的 index.php 中,我再次调用相同的方法,以确保我拥有正确的用户并有权查看页面:
require_once(dirname($_SERVER['DOCUMENT_ROOT']) . '/inc/autoloader.php');
$user = new cUser();
$user -> sec_session_start();
现在我无意中发现了这个错误。这是行:
if (ini_set('session.use_only_cookies', 1) === FALSE) {
我不确定这里有什么问题,有人可以帮我吗?
我认为理解 什么 导致 Headers already sent
错误很关键,这样才能查明你的错误是什么。
当有人请求网页时,发送任何形式的HTML之前页面的第一位是一组header。这些键值对包含有关页面的关键信息,例如状态代码(200 表示成功,404 表示未找到等)。
它还包含 cookie 信息,这是 PHP 会话如何工作的关键(我怀疑您可能知道您正在执行的命令)。
由于 header 是在请求开始时发送的,如果您将 any 输出到与 header 无关的页面(即使是 <?php
标签之外的换行符)这将阻止发送任何额外的 header 并抛出您看到的错误。
鉴于您看到的症状(这以前有效,但在 Docker 中无效),最可能的原因是在错误报告方面存在配置差异(错误报告在Docker 容器设置为高于 XAMPP) 或 PHP 版本(可能在 Docker 容器中使用更新版本的 PHP你在 XAMPP).
None 您发布的代码看起来应该是错误的,所以我假设这个潜在的错误发生在您的 autoloader.php
文件中。