10

我刚刚将我的应用程序从本地 WAMP 迁移到实际的在线服务器。这导致了会话 ID 未按其显示的样子保存的问题。

  • 我已经检查了 session_start 之前输出的不需要的字符
  • 我似乎找不到任何会话文件保存在我的 /tmp

这些是我的会话设置:

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  1000    1000
session.gc_maxlifetime  1440    1440
session.gc_probability  1   1
session.hash_bits_per_character 5   5
session.hash_function   0   0
session.name    PHPSESSID   PHPSESSID
session.referer_check   no value    no value
session.save_handler    files   files
session.save_path   /tmp    /tmp
session.serialize_handler   php php
session.use_cookies On  On
session.use_only_cookies    On  On
session.use_trans_sid   0   0
  • 在线服务器正在运行:PHP 版本 5.3.9,而 WAMP 正在运行:PHP 版本 5.3.5。
  • 通过查看发送的标题和每个页面加载中的响应,我得到以下信息,set-cookie 发送适当的会话 id,收到的响应发送一个新的响应,就好像没有任何请求一样。
  • 我在预览 URL 上运行该站点(启用 SSL)。我不知道这有什么关系,我的域还没有注册。
  • 错误代码很简单:

    $sId = session_id();

    if ($sId == '') { session_start(); }

4

7 回答 7

17

我刚刚解决了完全相同的问题。

事实证明,cookie PHPSESSID(记录会话)已发送,但被服务器忽略,因此会话没有被维护,并且每次页面重新加载或更改时服务器都会重新启动会话。

问题是我的 wp-config.php 中有这一行:

@ini_set('session.cookie_secure','On');

这意味着如果连接不安全,每个 cookie 都将被忽略,因此服务器 PHPSESSID cookie 和会话被重新启动。

检查您的wp-config.php或您的init.php。是cookies的问题。

于 2016-03-17T13:01:08.317 回答
3

You must have to write session_start(); before accessing any session variables, without it you will not able to access the session variables.

Try to put session_start() on the very first line of the file.

于 2012-11-09T12:01:07.820 回答
3

仅使用字母数字字符作为会话 ID。我在使用“。”时遇到了这个问题。作为会话 ID 的一部分。

于 2015-07-03T15:53:32.863 回答
2

session_start应该是文件中的第一件事,之后您可以获取会话 ID:

session_start();
$sId = session_id();
于 2012-11-09T10:56:54.347 回答
2

问题很老,最初的问题已经确定。然而,之前的答案最终在这种情况下并没有帮助。因此,如果有人遇到与我类似的问题,这是另一种方法:

会话使用 cookie 进行管理,通常称为PHPSESSID. 如果该 cookie 未正确声明,因此无法包含在用户的后续请求中,则每个请求都会启动另一个会话,导致情况至少与您的情况相似。

我试图实现一个在一些反向代理后面运行的应用程序,将公共 URL 映射到多个应用程序,例如

http://public.example.com/foo/bar/script.php

被委托给反向代理后面的某个服务器,提供为

http://foo.example.com/bar/script.php

对于在foo.example.com带有路径前缀的上下文中运行的 PHP,/bar而不是/foo/bar设置会话 cookie 的参数,PHPSESSID在传递给未调整的客户时可能会导致问题。至少在我的情况下,这种观察是正确的。

于 2014-04-12T06:15:22.210 回答
1

这可能是由某些程序(例如dreamweaver、notepad)在标记之前注入的三个字符(BOM(字节顺序标记<?php))引起的,因此实际上没有初始化会话。

如果您已error_reporting启用,您将看到headers already sent..

使用十六进制编辑器检查您的文件,看看您的编辑器是否注入了任何字符。

于 2014-04-28T10:33:39.713 回答
0

您应该首先启动会话以使用 session_* 函数。所以你需要做的第一件事是:

session_start();

然后你可以像这样询问会话ID

$id = session_id();

请注意,不建议将会话保存在对公众可用的公用文件夹中,因为访问者可以找到保存会话的文件夹并列出所有会话。然后他们可以将会话 cookie 注入他们的浏览器并控制其他访问者的用户帐户。如果您确实需要这样做,请限制对您的 /tmp 文件夹的访问。例如,使用此代码将 .htaccess 文件放在该文件夹中

Deny from all

或者找到任何其他方法来禁止用户浏览您的 /tmp 文件夹,因为这可能是安全问题。

如果您想在每个请求上更改会话 ID,出于安全原因,您可以使用session_regenerate_id 函数

你会做这样的事情:

session_start();
session_regenerate_id();
// Do other things you want with sessions.

这样,即使有人窃取了您的会话 cookie,会话 ID 也会在每次请求时更改。这可能是你的问题。PHP 有一种方法可以在每个请求上重新生成新的会话 id,所以这可能是困扰您的事情。

至于设置 php.ini 指令,您应该检查您的托管服务提供商是否允许您更改您尝试更改的 .ini 指令。是否可以更改 .ini 指令取决于服务器设置。并且会话的行为方式可能因托管而异,具体取决于它们的服务器设置方式。大多数事情都可以使用 php 函数或使用ini_set与此指令列表php.ini 指令进行更改

于 2012-11-09T11:51:46.613 回答