每次请求时PHP会话ID都会更改

每次请求时PHP会话ID都会更改,php,session,Php,Session,我刚刚将我的应用程序从本地WAMP迁移到实际的在线服务器。这导致会话ID无法按显示的方式保存 在会话开始之前,我已检查是否输出了不需要的字符 我似乎找不到任何保存在my/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_limit

我刚刚将我的应用程序从本地WAMP迁移到实际的在线服务器。这导致会话ID无法按显示的方式保存

  • 在会话开始之前,我已检查是否输出了不需要的字符
  • 我似乎找不到任何保存在my/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,接收到的响应发送一个新的会话id,就好像没有请求任何内容一样
  • 我在预览URL(SSL上)上运行该站点。我不知道这是否有什么关系,我的域名还没有注册
  • 错误代码如下所示:

    $sId=session_id()

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


会话\u启动
应该是文件中的第一件事,之后您可以获取会话id:

session_start();
$sId = session_id();

您应该首先启动会话以使用会话函数。因此,您需要做的第一件事是:

session_start();
然后你可以像这样要求会话id

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

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

如果您想更改每个请求的会话id,出于安全原因,您可以使用

您可以这样做:

session_start();
session_regenerate_id();
// Do other things you want with sessions.
这样,即使有人偷了您的会话cookie,会话id也会在每次请求时更改。这可能是你的问题。PHP有一种方法可以在每个请求上重新生成新的会话id,因此这可能是困扰您的问题


至于设置php.ini指令,您应该检查托管提供商是否允许您更改您试图更改的.ini指令。是否可以更改.ini指令取决于服务器设置。会话的行为方式可能因主机而异,这取决于它们的服务器设置。使用php函数或使用此指令列表可以更改大部分内容

您必须编写session_start();在访问任何会话变量之前,如果没有它,您将无法访问会话变量


尝试将会话_start()放在文件的第一行。

问题很老,初始问题肯定已解决。然而,之前的答案最终对这种情况没有帮助。因此,如果有人遇到与我类似的问题,这里有另一种方法:

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

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

http://public.example.com/foo/bar/script.php
已委托给反向代理后面的某个服务器,如

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

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

这可能是由于在
只使用字母数字字符作为会话ID之前,某些程序(即dreamweaver、记事本)注入了三个字符(BOM())造成的。我在使用“.”作为会话ID的一部分。

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

事实证明,cookie PHPSESSID(保存会话记录)已发送,但服务器忽略了它,因此会话未被维护,服务器在每次重新加载或更改页面时都重新启动会话

问题是我的wp-config.php中有以下行:

@ini_set('session.cookie_secure','On');
这意味着,如果连接不安全,则将忽略每个cookie,因此服务器将删除PHPSESSID cookie并重新启动会话


检查您的wp config.phpinit.php。cookies有问题。

谢谢您的回复。我从session_start()开始;现在,我不会检查会话_id(),直到执行的后面(只是为了找出它是哪一个)。每次请求时,我的会话Id仍在刷新,而无需调用重新生成Id或任何类似的操作。简单的会话开始->存储一些变量->执行结束(应该写关闭)->下一页请求->Id和会话变量都不存在。看起来这是主机的预览页问题。谢谢大家的回答!很抱歉,我可能没有明确表示我希望在每个请求中保留相同的会话Id,并且它会在我不调用REGENATE的情况下重置。谢谢。那么我假设会话id会在每次请求时重新生成。那是什么样的申请?您是从scratch编写的,还是某种mvc框架?您应该检查代码并检查会话是否重新生成,或者询问主机提供商他们是否重新生成会话。我将发布一个问题,以防供应商。如果有任何其他想法,请不要犹豫,再次与我联系。脚本是从头开始编写的,在输出任何内容之前,我使用输出缓冲区和会话启动。所以这是无法解释的。E