为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?
Posted
技术标签:
【中文标题】为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?【英文标题】:Why PHP $_SESSION variable not working when being used in header() method?为什么 PHP $_SESSION 变量在 header() 方法中使用时不起作用? 【发布时间】:2021-07-25 10:37:00 【问题描述】:最近,我在开发 php 脚本时遇到了一个奇怪的对比。
关键是,我想使用全局 $_SESSION
变量将 HTTP 响应状态代码发送到另一个页面。然后在目标页面上,我将使用header()
方法将这个HTTP 响应状态码发送到浏览器。 HTTP 响应状态码是什么并不重要。例如,我们在这里考虑 “422 Unprocessable Entity”。
所以,我们很容易编写我们的脚本:
file1.php:(源文件)
<?php
session_start();
$_SESSION['xyz'] = "422 Unprocessable Entity";
header('Location: file2.php');
file2.php:(目标文件)
<?php
session_start();
header("HTTP/1.1 " . $_SESSION['xyz']);
var_dump($_SESSION['xyz']);
unset($_SESSION['xyz']);
输入网址example.com/file1.php
后,我们将毫无问题地转移到目的地(example.com/file2.php
)。在浏览器控制台(网络选项卡)中,我们将看到 422 错误。没有创建error_log文件,页面的输出内容为:
string(24) "422 Unprocessable Entity"
一切看起来都不错。 但问题是,如果你使用https://httpstatus.io/检查发送的header的正确性,除了在你的服务器上创建一个error_log文件,你会遇到如下输出:
这很令人困惑。而且error_log文件的内容是:
[02-May-2021 22:21:13 UTC] PHP Warning: Undefined array key "xyz" in /www_root/file2.php on line 3
[02-May-2021 22:21:13 UTC] PHP Warning: Undefined array key "xyz" in /www_root/file2.php on line 4
表示变量$_SESSION['xyz']
没有设置。
我尝试通过修改file2.php
来调试脚本:
<?php
session_start();
header("HTTP/1.1 422 Unprocessable Entity");
var_dump($_SESSION['xyz']);
unset($_SESSION['xyz']);
然后,问题就莫名其妙地解决了:
现在我想问一个问题,我的方法(将HTTP响应状态码传递到另一个页面)的基础是否正确?如果是这样,为什么我会收到错误消息?在接收$_SESSION
变量之前,header()
方法是否在 PHP 中执行?这两个函数的执行时间表是什么?感谢您的帮助。
【问题讨论】:
【参考方案1】:我怀疑网站检查出了点问题。
具体来说,如果服务器确实遵循了重定向,但没有设置会话 cookie 标头,您所感叹的行为是我所期望的。如果是这种情况,那么file2.php
会得到一个空会话。
尝试在 file2.php 中输出session_id()
并查看它是否在 file1 和 file2 之间发生变化(如果 cookie 传输正确,它不应该发生变化)。
或者可以在该位置发送一个 GET 变量,例如 id=(session id)。然后在 file2.php 中验证您是否获得了 session_id() 的 id。如果不是,请连接到“好”会话 ID(请参阅 session_id 手册页)。看看 then 你是否看到了 xyz 键。很有可能你会的。
【讨论】:
您的怀疑可能是正确的。我认为我们的脚本完全没有问题。问题是“httpstatus.io”在从 file1.php 转换到 file2.php(302 重定向)期间没有保留和传输 $_SESSION 变量。现在在这种情况下,您认为防止error_log被创建的最简单方法是什么? 只需在session_start()
后添加if(isset($_SESSION['xyz']))
,error_log就不会再创建了。以上是关于为啥 PHP $_SESSION 变量在 header() 方法中使用时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
PHP $_SESSION['key'] 被输入按钮值覆盖。为啥?