PHP会话ID随每个请求而变化

时间:2012-11-09 10:53:20

标签: php session

我刚将我的应用程序从本地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,收到的响应发送一个新的响应,就像没有请求任何内容一样。
  • 我在预览网址(SSL on)上运行网站。我不知道这是否有任何关系,我的域名尚未注册。
  • 错误代码简单如下:

    $sId = session_id();

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

7 个答案:

答案 0 :(得分:11)

我刚刚解决了同样的问题。

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

问题是我在wp-config.php这行:

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

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

检查 wp-config.php init.php 。是cookie的问题。

答案 1 :(得分:2)

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

尝试将session_start()放在文件的第一行。

答案 2 :(得分:1)

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

session_start();
$sId = session_id();

答案 3 :(得分:1)

问题已经过时,初步问题已经解决了。但是,之前的答案最终没有帮助。所以,如果有人遇到与我类似的问题,这是另一种方法:

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

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

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

被委托给以

提供的反向代理后面的某个服务器
http://foo.example.com/bar/script.php

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

答案 4 :(得分:1)

这可能是由<?php标记之前某些程序(即Dreamweaver,notepad)注入的三个字符(BOM(Byte Order Mark))引起的,因此事实上并未初始化。 / p>

如果您启用了error_reporting,则会看到headers already sent ..

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

答案 5 :(得分:1)

仅使用字母数字字符作为会话ID。使用&#34;时遇到了这个问题。&#34;作为会话ID的一部分。

答案 6 :(得分:0)

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

session_start();

然后你可以像这样要求会话ID

$id = session_id();

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

Deny from all

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

如果您想更改每个请求的会话ID,出于安全考虑,您可以使用session_regenerate_id function

你会做这样的事情:

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 directives

进行更改