为啥 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 会话变量进行排序而不是取消设置

PHP $_SESSION['key'] 被输入按钮值覆盖。为啥?

为啥我不能将 PHP 类实例存储为 SESSION 变量

为啥网页不能正常跳转(在线等-------)

PHP中为啥$_SESSION语句同时用时,临时文件里有一个是空的?

PHP:$_SESSION - 在 $_SESSION 变量中存储临时使用的数据的优缺点是啥