【问题标题】:SESSION working fine on server but not maintained through outSESSION 在服务器上工作正常,但没有得到维护
【发布时间】:2011-12-16 06:42:26
【问题描述】:

我正在使用 PHP 为 Head、Main、Normal 三种用户创建网站。 因此,我创建了一个用于记录的页面,它将检查凭据并将会话移动到相应的文件夹。我有类似的结构

main //folder
head //folder
normal //folder
index.php

这个 index.php 将检查用户类型并导航到相应文件夹的索引页面。

它在本地主机上运行良好。但在服务器上,它正确重定向到文件夹,但会话为空,因此出现空白页。

我做了

DEFINE('COOKIE_BASE_DOMAIN_NAME', '.domain.com');
ini_set('session.cookie_domain', COOKIE_BASE_DOMAIN_NAME);
session_start();

在每一页上,但问题仍然相同。我检查了会话路径,所以我打印了 phpinfo,我得到了

session
Session Support     enabled
Registered save handlers    files user sqlite
Registered serializer handlers  php php_binary wddx

Directive   Local Value Master Value
session.auto_start  Off Off
session.bug_compat_42   Off Off
session.bug_compat_warn On  On
session.cache_expire    180 180
session.cache_limiter   nocache nocache
session.cookie_domain   no value    no value
session.cookie_httponly Off Off
session.cookie_lifetime 0   0
session.cookie_path /   /
session.cookie_secure   Off Off
session.entropy_file    no value    no value
session.entropy_length  0   0
session.gc_divisor  100 100
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 4   4
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /var/php_sessions   /var/php_sessions
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    Off Off
session.use_trans_sid   1   1

知道我缺少什么或应该怎么做吗?会话正在创建,因为它导航到其他页面,并且有一个条件是在会话创建后它应该只导航。但在第二页会话数组为空。想法将受到高度赞赏。

【问题讨论】:

  • 您是否在后续页面中调用session_start()
  • 您在子页面上获得了新的会话 ID 还是相同的 echo session_id();
  • 两者从主索引页到登录和重定向后的页面都是一样的 5253fabb6d6138db2537a4e37325f2a6 5253fabb6d6138db2537a4e37325f2a6

标签: php session session-variables


【解决方案1】:

您可以检查目录 /var/php_sessions ...是否权限正常并且文件是否在那里创建。

除此之外,只需启动一个新会话,如果不存在并禁用 cookie 超时(直到浏览器断开连接):

if(!$_SESSION){
   session_set_cookie_params(0);
   session_start();
}

调试:

出于调试目的,将路径更改为可访问的内容会很有帮助,例如:

ini_set('session.save_path','/home/someuser/public_html/sessions/');

在生产环境中,在任何情况下都必须在 web-root 之外,请参阅下面的评论。

如果一切都没有帮助,请在后续页面上尝试类似的操作(您的 phpinfo 缺少相关信息,因此只是猜测):

$_SESSION[SID]['page']

提示:

当您更改某些内容时,调用 session_destroy() 或删除浏览器中的 PHPSESSID cookie ...

【讨论】:

  • 感谢您的回答。但是什么也没发生,我无权访问 /var 文件夹。那我该怎么做呢?
  • 如果不是 cookie,你有什么推荐的?
  • @Astha:您可以定义另一个 session.save_path 位置 - 最好在 web-root 之上一层(在任何情况下都必须无法通过 HTTP 访问)。如果你不能上去 - 只需将 webroot 设置得更深一层,例如: /public_html/sessions/ 和 /public_html/htdocs ... ini_set('session.save_path','/public_html/sessions/');将路径更改为您可以访问的路径也可能有助于找出问题所在...
  • PHP 会话是基于 cookie 的,最安全的会话使用 cookie,而不是在输出 HTML 中污染 URL 的可怕的transid 废话。对于使用会话的人来说,没有打开 cookie 不是问题 - 这是使用该网站的必要条件。
  • 确实,有一个名为 PHPSESSID 的 cookie - 到期:在会话结束时...“记住我”功能完全相同 - 只是有另一个到期日期。如果客户端不支持 cookie - SID 仍然可以隐藏在 ajax 调用中 - 而不是在浏览器的地址栏中显示它(例如,它不会被保存到书签中)。我主要编写 AJAX 应用程序,问题是会话需要通过偶尔访问任何空白页面来及时拉伸,以保持会话处于活动状态 - 只需 ping/pong。
【解决方案2】:

看起来 cookie 无法正常工作(或被阻止或其他原因)。如果 cookie 不起作用,PHP 会将会话 ID 添加到查询字符串中 URL 的末尾(作为 PHPSESSID)。

如果使用 header() 重定向,会话 ID 不会自动附加,会话 ID 会丢失。

你可以试试这个:

header("Location: folder/index.php?" . SID);
exit();

【讨论】:

  • 使用查询字符串传输 SID 是不安全的,不推荐。无论如何,下次单击时会话将丢失。正如 OP 在 cmets 中确认的那样,会话标识符可以正常传输
  • 是的,但它可能会让人知道是什么原因造成的。看起来 SID 没有正确传输,因为 OP 在重定向之前检查会话是否存在,并且在重定向之后,没有会话剩余。
  • 基于 mySQL 的会话在每种情况下都是首选(当基于文件的会话失败时)。此外,似乎 OP 并未尝试将保存路径更改为可通过 FTP 访问的任何位置。您可能会说“它有效” - 但是如何......这个解决方案只是绝对反模式的一个很好的例子。如果我的声誉只提高 1 点,我肯定会投票否决 :)
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多