【问题标题】:Session variable missing upon redirect ONLY if I send a 403 Header (PHP)仅当我发送 403 标头(PHP)时,会话变量才会在重定向时丢失
【发布时间】:2014-01-30 14:52:29
【问题描述】:

在我的一个环境中,我有一个页面设置会话变量,然后重定向到另一个,类似于以下:

ScriptA.php

session_start();
$_SESSION['foo'] = 'bar';
header("redirect: ScriptB.php");
die()

ScriptB.php

session_start();
header("HTTP/1.0 403 Forbidden");
echo $_SESSION['foo']; //will print nothing
unset($_SESSION['foo']);

如果我在 ScriptB.php 中注释我们的标题行,它将打印该值。很奇怪。

有什么想法吗?我以前从未见过这种行为。

注意:这是一个 Win 2008 服务器,运行 IIS 7 和 PHP 5.3

【问题讨论】:

  • 您将 PHP_SESSION_ID 作为 GET 参数还是通过 cookie 发送?如果您使用的是 GET 参数,它可能会在重定向期间丢失。如果您在重定向期间更改域,它也会丢失,即使使用 cookie。
  • 如果错误消息小于 X 个字符,则有些浏览器会替换自己的逻辑。 See also this answer.
  • 发送 403 Forbidden 标头后,您无法将输出发送到页面。
  • 为什么是“如果我在 ScriptB.php 中注释我们的标题行,它将打印该值。很奇怪。”奇怪的?你已经有你的标题输出了!!!!
  • 我没有友好的 403,但我只是做了一个测试以发送 403 并显示我的友好 404 并且它有效:<?php header("HTTP/1.0 403 Forbidden"); readfile('http://www.example.com/404_error'); ?> 所以@crush 的评论不正确。 (当我尝试一条小消息时,浏览器显示它是默认响应。)

标签: php session


【解决方案1】:

脚本 B 应该是这样的

ob_start();
session_start();
echo $_SESSION['foo']; //This should print
unset($_SESSION['foo']);
header("HTTP/1.0 403 Forbidden"); <--- moved to bottom
ob_end_flush();

【讨论】:

【解决方案2】:

试试这个:

脚本 B

<?php
session_start();
header("HTTP/1.0 403 Forbidden");
echo $_SESSION['foo']."<br><br>\n\n"; //This should print
unset($_SESSION['foo']);
readfile('path/to/some/friendly403message.html');

您可能只需要足够的文本让浏览器认为您的信息比默认信息更有帮助。

【讨论】:

  • 谢谢,但我能够添加垃圾文本并且它仍然显示。该变量根本不在会话中。我通过 print_r($_SESSION); 进行确认;
猜你喜欢
  • 2012-07-08
  • 2014-01-04
  • 2012-02-25
  • 2012-06-19
  • 1970-01-01
  • 2014-08-14
  • 2012-04-15
  • 2019-07-09
相关资源
最近更新 更多