【发布时间】: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 的评论不正确。 (当我尝试一条小消息时,浏览器显示它是默认响应。)