0

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

我的标头重定向如下所示: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 = 设置会话 vars 后重定向 => user_dash.php 回显 vars 并且没有任何显示(空 vars,if 语句回显 if isset)

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

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

6 回答 6

3

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

<?php session_start(); ?>
Hello<?php echo " ".$_SESSION['firstname']." ".$_SESSION['lastname'];?>.
于 2012-05-02T17:13:36.523 回答
1

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

这可能会让您大吃一惊,但调试需要程序员的大部分时间。所以,是时候学习一些真正的程序员工作了。

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

一起使用session_write_close()是最防弹的方式

如果它仍然不起作用,请开始调试它。

  • 检查会话文件
  • 检查饼干
  • 检查ini设置
  • 检查 user_dash.php 中的会话 ID - 是否相同?
  • 检查您是否真的丢失了所有会话或者可能只是一个变量

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

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

我可能忽略了一些,因为我没有为调试您的应用程序获得报酬,而且我有自己的工作要做。所以,我只是建议将所有设置设为默认值,并且在您确定自己在做什么之前永远不要触摸它们

于 2012-05-02T19:34:40.117 回答
0

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

于 2012-05-03T16:55:46.823 回答
0

我们可以通过两种方式解决此问题

一世 。在 Firefox 浏览器设置中将字符编码更改为“UTF-8”

二、在页面添加PHP代码

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

which you going to post

Thanks,

Suresh Ramakrishnan

于 2013-11-27T11:56:31.243 回答
-1

处理重定向和 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() 问题。

于 2012-05-02T17:46:58.973 回答
-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 的值,这实际上对您来说可能是一个不错的选择。

于 2012-05-02T20:08:36.900 回答