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

Php 如何使会话变量在头重定向中保持不变?,php,html,sql,Php,Html,Sql,如何使会话变量在头重定向中保持不变? 我的头重定向如下:头(“位置:./content/user_dash.php”) 我有session_start()位于每页的顶部 在我的头重定向会话\u重新生成\u id(true)之前,我已经尝试过了 我尝试了在我的头之前和会话之后重新生成id重定向session\u write\u close() 我已尝试退出(0)和模具()在我的头重定向之后 我尝试了标题(“位置:./content/user_dash.php?PHPSESSID=“.session

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

我的头重定向如下:
头(“位置:./content/user_dash.php”)

我有
session_start()位于每页的顶部

在我的头重定向
会话\u重新生成\u id(true)之前,我已经尝试过了

我尝试了在我的头之前和会话之后重新生成id重定向
session\u write\u close()

我已尝试退出(0)
模具()在我的头重定向之后

我尝试了
标题(“位置:./content/user_dash.php?PHPSESSID=“.session_id())

如果我包含结束页,它会工作(但我不能使用它),当我更改它以重定向变量时,它会停止工作。我通过$\u会话使用foreach循环对此进行了测试,它在包含页面时会打印,但在重定向时不会打印

我有点发火,因为我真的需要在重定向后使用会话变量

文件结构:

index.php=submits login form=>login\u code.php=在设置会话变量=>user\u dash.php echos vars并没有显示任何内容后重定向(空变量,if语句要echo 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

会话\u start()
置于任何其他代码(包括纯文本)之前

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

你好

处理重定向和标头()+刷新/位置可能会导致会话id更新,具体取决于所使用的PHP结构:

根据经验,我发现命名会话确实有助于寻址值,因为会话名称会阻止会话id被刷新:


请阅读:


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()问题

您需要调试应用程序

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

header("Location:./content/user_dash.php?".session_name()."=".session_id());
session\u write\u close()
一起使用是最安全的方法

如果它仍然不工作,开始调试它

  • 检查会话文件
  • 检查饼干
  • 检查ini设置
  • 检查user_dash.php中的会话id-是否相同
  • 检查您是否真的丢失了所有会话,或者可能只是一个变量
谢谢你的ini设置。 我能看到两个可疑的

  • session.use_only_cookies On表示通过url发送SID无效。再次检查会话cookies
  • session.cache_expire 180太小了
我可能忽略了一些,因为我没有为调试你的应用程序获得报酬,我有自己的工作要做。
因此,我建议将所有设置设为默认设置,在您知道自己在做什么之前不要触摸它们。当然

在阅读了一些关于这个特定问题的内容后,我注意到,在上一篇文章中,关于这个问题已经进行了大量的讨论

在一次关于此特定问题的讨论中发现的解决方案是使用元刷新重定向用户:

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

引用:

*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
为了让PHP能够“找到”先前设置的会话变量,它必须能够识别客户端,对吗?好的,用于实现这一点的默认方法是在启动会话时通过cookie集。由于您似乎正在使用启动会话的同一页面上的位置标头将用户重定向到成员的唯一页面,因此不会设置PHPSESSID cookie。因此,一旦用户到达成员的唯一页面,PHP将无法识别用户。他们的会话变量仍然存在,但PHP不会将其提供给陌生人。:)


基本上,在包含Set Cookie头的HTTP响应中,它需要是常规的200OK响应,而不是协议级重定向。如果你必须要有你在这里想要的行为,你必须使用元刷新来重定向。是的,虽然没有那么酷,但这是在同一响应中设置cookie和重定向客户端的唯一方法。否则,您必须在URL上传递cookie的值,这实际上可能是一个不错的选择。

我发现我的问题的一部分my$\u会话变量(尽管已设置)没有与会话id一起保存到cookie中。在该特定问题上发布新问题。

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

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

二,。通过PHP代码在页面上添加

你要发哪一个

谢谢


Suresh Ramakrishnan

我有一个名为login_session.php的脚本,我在每个页面的顶部都包含了这个脚本。那你为什么在你的问题中发布的代码中再次调用它?你是否重定向到另一个域?@Event_Horizon,澄清一下,把
session_start()放进去
在您访问会话变量的每个PHP页面的顶部。header()与会话变量有一些问题,请阅读:
refresh
不是正式的HTTP头。它是网景专有的。不要依赖于它的工作。它不应该影响会话,因为会话是通过cookie完成的。但是,如果cookie设置不正确,执行重定向可能会导致会话cookie“丢失”。您是否可以放置PHP代码的基本结构,以便更好地了解失败的原因?是否必须在每一页上都这样做?是的,但是将其放在一个文件中,并在主文件上调用该文件(首先要做的事情),或者,如果你重定向了很多,在每个文件上调用它。(请记住,会话名称必须始终在会话之前。)