Php session 没有通过发送 headers 发送到其他页面
Php session are not being sent to other page by sending headers
Page1
header("Location:Page2.php");
session_start();
$_SESSION['username']=$NOFCHILDREN;
Page2
session_start();
$name=$_SESSION['username'];
echo $name;
第 2 页显示错误
“注意:未定义的索引:用户名在”
这个问题有什么解决办法吗??
在 page1 中,按照以下代码放置代码
session_start();
$_SESSION['username']=$NOFCHILDREN;
header("Location:Page2.php");
您的代码在会话设置变量之前重定向。它不应该以这种方式工作。所以在会话集之后添加你的重定向。
最可能的错误来源是:
不接受会话 cookie
检查您的浏览器是否接受会话cookie。您可以在“应用程序”选项卡 (Chrome) 或“存储”选项卡 (Firefox) 中的开发人员工具中看到它。如果 PHPSESSID cookie 在每次请求时都发生变化,则不会接受会话 cookie。控制台选项卡中可能会打印详细信息。
总是在任何 session_start
调用之前调用 set_session_cookie_params。这样您就可以控制会话 cookie。
set_session_cookie_params([
'lifetime' => 57600,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => '', // or 'Strict' to make cross site attacks harder
]);
您也可以设置 INI options,尽管这是应用程序外配置,而且我发现让应用程序处理其会话 cookie 更容易。少出错。
玩饼干
使用curl或其他一些HTTP请求摆弄工具,您可以确认确实是浏览器干扰:
# Do a normal GET request to your first page, printing only headers.
$ curl -v -o /dev/null https://example.org/page1.php
[...]
< HTTP/2 200
[...]
< set-cookie: PHPSESSID=xxx; expires=Mon, 04-Jan-2021 07:02:24 GMT; Max-Age=57600; path=/; domain=example.org; secure; HttpOnly; SameSite=None
# Do the second page request manually with the cookie copied from above output.
$ curl -b 'PHPSESSID=xxx' https://example.org/page2.php
其他可能的来源
这些真的只是幸运的猜测,无法访问您的系统:
- 检查会话文件是否写入正确。 session_save_path 给你目录。那里有名称等于 PHPSESSID cookie 值的文件(再次检查开发人员工具或 curl)。
- 它真的被写了吗?如果不是:检查目录的权限。
- 是否写入了预期数据,但很快被 empty/other 数据覆盖?可能存在竞争条件,尽管您的两个简单脚本听起来不太可能。 Ajax 调用是竞争条件的候选者。
- 如果您使用
files
以外的任何会话处理程序,则可能存在大量其他错误源。通过 ini_get('session.save_handler')
检查您使用的处理程序。
Page1
header("Location:Page2.php");
session_start();
$_SESSION['username']=$NOFCHILDREN;
Page2
session_start();
$name=$_SESSION['username'];
echo $name;
第 2 页显示错误 “注意:未定义的索引:用户名在” 这个问题有什么解决办法吗??
在 page1 中,按照以下代码放置代码
session_start();
$_SESSION['username']=$NOFCHILDREN;
header("Location:Page2.php");
您的代码在会话设置变量之前重定向。它不应该以这种方式工作。所以在会话集之后添加你的重定向。
最可能的错误来源是:
不接受会话 cookie
检查您的浏览器是否接受会话cookie。您可以在“应用程序”选项卡 (Chrome) 或“存储”选项卡 (Firefox) 中的开发人员工具中看到它。如果 PHPSESSID cookie 在每次请求时都发生变化,则不会接受会话 cookie。控制台选项卡中可能会打印详细信息。
总是在任何 session_start
调用之前调用 set_session_cookie_params。这样您就可以控制会话 cookie。
set_session_cookie_params([
'lifetime' => 57600,
'path' => '/',
'domain' => 'example.com',
'secure' => true,
'httponly' => true,
'samesite' => '', // or 'Strict' to make cross site attacks harder
]);
您也可以设置 INI options,尽管这是应用程序外配置,而且我发现让应用程序处理其会话 cookie 更容易。少出错。
玩饼干
使用curl或其他一些HTTP请求摆弄工具,您可以确认确实是浏览器干扰:
# Do a normal GET request to your first page, printing only headers.
$ curl -v -o /dev/null https://example.org/page1.php
[...]
< HTTP/2 200
[...]
< set-cookie: PHPSESSID=xxx; expires=Mon, 04-Jan-2021 07:02:24 GMT; Max-Age=57600; path=/; domain=example.org; secure; HttpOnly; SameSite=None
# Do the second page request manually with the cookie copied from above output.
$ curl -b 'PHPSESSID=xxx' https://example.org/page2.php
其他可能的来源
这些真的只是幸运的猜测,无法访问您的系统:
- 检查会话文件是否写入正确。 session_save_path 给你目录。那里有名称等于 PHPSESSID cookie 值的文件(再次检查开发人员工具或 curl)。
- 它真的被写了吗?如果不是:检查目录的权限。
- 是否写入了预期数据,但很快被 empty/other 数据覆盖?可能存在竞争条件,尽管您的两个简单脚本听起来不太可能。 Ajax 调用是竞争条件的候选者。
- 如果您使用
files
以外的任何会话处理程序,则可能存在大量其他错误源。通过ini_get('session.save_handler')
检查您使用的处理程序。