我刚将我的应用程序从本地WAMP迁移到实际的在线服务器。这会导致会话ID未显示时出现问题。
这些是我的会话设置:
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
错误代码简单如下:
$sId = session_id();
if ($sId == '') { session_start(); }
答案 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
进行更改