如何让会话变量在标题重定向中保持不变?

时间:2012-05-02 17:12:16

标签: php html sql

如何让会话变量在标题重定向中保持不变?

我的标题重定向如下所示: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());

如果我包含它可以使用的结束页面(但我不能使用它),当我将其更改为重定向时,我的变量停止工作。我通过$ _SESSION使用foreach循环测试了它,并在包含页面时打印,但不在重定向上打印。

我有点拉扯我的头发因为我确实需要在重定向后使用会话变量。

文件结构:

index.php =提交登录表格=> login_code.php =在设置会话变量后重定向=> user_dash.php echos vars并且没有显示(空的vars,如果是isset则返回if语句)

我删除了重定向,甚至简单的超链接都没有将我的会话变量带到下一页。

实时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

6 个答案:

答案 0 :(得分:3)

session_start()放在任何其他代码之前,包括纯文本。

<?php session_start(); ?>
Hello<?php echo " ".$_SESSION['firstname']." ".$_SESSION['lastname'];?>.

答案 1 :(得分:1)

您需要调试您的应用程序。

对你来说这可能是一个惊喜,但是调试会占用大部分程序员的时间。所以,是时候学习一些真正的程序员的工作了。

header("Location:./content/user_dash.php?".session_name()."=".session_id());

session_write_close()一起使用是一种最无懈可击的方式

如果它仍然无法启动调试它。

  • 检查会话文件
  • 检查cookies
  • check ini settings
  • 检查user_dash.php中的会话ID - 是否相同?
  • 检查您是否真的失去了所有会话,或者可能只是一个变量

谢谢你的ini设置。 我可以看到2个可疑的

  • session.use_only_cookies On表示通过url发送SID无效。检查会话cookie AGAIN
  • session.cache_expire 180 180太小了。

我可能会忽略一些,因为我没有为你的应用程序调试付出代价,我有自己的工作要完成。 所以,我只是建议将所有设置设为默认值,直到你知道自己在做什么之后再也不要触摸它们

答案 2 :(得分:0)

我发现我的问题的一部分虽然被设置的$ _SESSION变量没有与会话ID一起保存到cookie中。针对该特定问题发布新问题。

答案 3 :(得分:0)

我们可以通过两种方式修复此问题

我是在Firefox浏览器中设置更改字符编码为“UTF-8”

ii。通过页面上的PHP代码添加

<?php header('Content-Type: text/html; charset=utf-8'); ?>

你要发布

谢谢,

Suresh Ramakrishnan

答案 4 :(得分:-1)

处理重定向和header()+ refresh / location,可能会导致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()问题。

答案 5 :(得分:-1)

在阅读了一些关于这个特定问题的内容之后,我注意到在bugs.php.net上,对此进行了大量讨论。

在其中一个问题中找到的有关此特定问题的讨论是使用META Refresh重定向用户:

<meta http-equiv="refresh" content="0; url=http://example.com/">

<强>引用

为了让PHP能够“找到”先前设置的会话变量,它必须能够识别客户端,对吧?嗯,用于完成此操作的默认方法是在启动会话时通过cookie设置。由于您似乎正在使用同一页面上的Location标头将用户重定向到该成员的唯一页面,因此将不会设置PHPSESSID cookie。因此,一旦用户到达会员唯一的页面,PHP将无法识别用户。他们的会话变量仍然存在,但PHP不会将它交给陌生人。 :)

基本上,在包含Set-Cookie标头的HTTP响应中,它需要是常规的200 OK响应而不是协议级重定向。如果您必须拥有此处的行为,那么您将不得不使用元刷新进行重定向。是的,它并不酷,但它是设置cookie并在同一响应中重定向客户端的唯一方法。否则,您必须在URL上传递cookie的值,这对您来说可能是个不错的选择。