如何让会话变量在标头重定向中持续存在?
我的标题重定向如下所示:header("Location:./content/user_dash.php");
我在每页的顶部都有session_start();
。
我在标题重定向之前尝试过session_regenerate_id(true);
我已经在我的标题之前和之后尝试过session_regenerate_id重定向session_write_close();
我已经尝试了exit(0);
,并在标题重定向后die();
;
我试过header("Location:./content/user_dash.php?PHPSESSID=".session_id());
如果我包含结束页面,它可以工作(但我不能使用它(,当我更改它以重定向我的变量时停止工作。我用 foreach 循环通过 $_SESSION 对此进行了测试,它在包含页面时打印,但不在重定向时打印。
我对此有点不知所措,因为我确实需要在重定向后使用会话变量。
文件结构:
索引.php = 提交登录表单 => login_code.php = 设置会话变量后重定向 => user_dash.php 回显变量,但未显示任何内容(空变量,如果 IS set 则回显语句(
我已经删除了重定向,即使是简单的超链接也不会将我的会话变量带到下一页。
实时 HTTP 标头:
*serverinfo*/login_code.php
POST *serverinfo*/login_code.php HTTP/1.1
Host: server
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: *serverinfo*
Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3
Content-Type: application/x-www-form-urlencoded
Content-Length: 29
username=user&password=pass
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.10, ASP.NET
Date: Thu, 03 May 2012 16:24:54 GMT
Content-Length: 159
----------------------------------------------------------
*serverinfo*/content/admin_dash.php
GET *serverinfo*/content/admin_dash.php HTTP/1.1
Host: server
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cookie: PHPSESSID=im7kid3isj1q9ft03a68s6d5i3
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: Microsoft-IIS/7.5
X-Powered-By: PHP/5.3.10, ASP.NET
Date: Thu, 03 May 2012 16:24:54 GMT
Content-Length: 3474
将session_start()
放在任何其他代码(包括纯文本(之前。
<?php session_start(); ?>
Hello<?php echo " ".$_SESSION['firstname']." ".$_SESSION['lastname'];?>.
您需要调试应用程序。
这对您来说可能是一个惊喜,但调试需要程序员的大部分时间。所以,是时候学习一些真正的程序员工作了。
header("Location:./content/user_dash.php?".session_name()."=".session_id());
与session_write_close()
一起使用是最防弹的方式
如果仍然无法正常工作,请开始调试它。
- 检查会话文件
- 检查饼干
- 检查 INI 设置
- 检查user_dash.php中的会话 ID - 是否相同?
- 检查您是否真的丢失了所有会话,或者可能只是一个变量
感谢您的 INI 设置。我可以看到 2 个可疑的
- session.use_only_cookies "开"表示通过 URL 发送 SID 将不起作用。 再次检查会话饼干
- session.cache_expire 180 180 太小了。
可能会忽略一些,因为我没有得到调试您的应用程序的报酬,而且我有自己的工作要做。所以,我只是建议将所有设置设为默认设置,在你知道自己在做什么之前,永远不要触摸它们
我发现了我的部分问题,尽管设置了我的 $_SESSION 变量,但并未与会话 ID 一起保存到 cookie 中。 发布有关该特定问题的新问题。
我们可以通过两种方式解决此问题
我。 在火狐浏览器设置中将字符编码更改为"UTF-8"
第二。通过页面添加的PHP代码
<?php header('Content-Type: text/html; charset=utf-8'); ?>
你要发布的
谢谢
苏雷什·拉马克里希南
处理重定向和 header(( + 刷新/位置,可能会导致session_id更新,具体取决于所使用的 PHP 结构:
根据经验,我发现命名会话确实有助于解决值问题,因为session_name会阻止刷新session_id:
阅读: http://pt2.php.net/session_name
PHP高于一切
// If session is not set, this will set it up with the defined name.
// Session is then initialized.
define("CONF_SESSION_NAME", 'my_session_named');
if (!isset($_SESSION)) {
session_name(CONF_SESSION_NAME);
session_start();
}
根据我的经验,这可以避免来自同一位置的多个平台的会话冲突,并且确实有助于解决 header(( 问题。
在阅读了有关此特定问题的一些内容后,我注意到在 bugs.php.net 上对此进行了大量讨论。
在有关此特定问题的讨论之一中找到的解决方案是使用 META 刷新重定向用户:
<meta http-equiv="refresh" content="0; url=http://example.com/">
引用:
为了让PHP能够"找到"以前设置的会话变量,它必须能够识别客户端,对吧?好吧,用于完成此操作的默认方法是通过启动会话时设置的cookie。由于您似乎正在使用启动会话的同一页面上的位置标题将用户重定向到成员的唯一页面,因此不会设置 PHPSESSID cookie。因此,一旦用户到达成员的唯一页面,PHP 将无法识别用户。他们的会话变量仍然存在,但PHP不会把它交给陌生人。:)
基本上,在包含 Set-Cookie 标头的 HTTP 响应中,它需要是常规的 200 OK 响应,而不是协议级别的重定向。如果您绝对必须具有此处要执行的行为,则必须使用元刷新进行重定向。是的,它没有那么酷,但这是设置cookie并在同一响应中重定向客户端的唯一方法。否则,您必须在URL上传递cookie的值,这对您来说可能是一个不错的选择。