PHP / Apache - 会话没有坚持

时间:2013-04-13 10:10:41

标签: php apache session mod-rewrite

我在Windows 7(x64)上使用Apache 2.4.4和PHP 5.4.14。我遇到的问题是php会话不坚持。这也发生在Apache 2.2和PHP 5.4.4上,昨天更新,希望它只是php.ini中的一个糟糕设置,但没有任何改变。

在Chrome中,只有在我使用重写规则时,每个页面的会话ID才会发生变化。使用重写规则时,Cookie path奇怪地更改为/pages_name/而不是保留/

在Opera中,即使刷新页面,会话ID也会发生变化。在IE中也是如此。

在这两种情况下,浏览器都会接受cookie。

RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/?$ index.php?page=$1&info1=$2&info2=$3 [L]
RewriteRule ^([a-zA-Z]+)/([a-zA-Z0-9]+)/?$ index.php?page=$1&info1=$2 [L]
RewriteRule ^([a-zA-Z]+)/?$ index.php?page=$1 [L]

在搜索之后,我遇到了一些"解决方案"没有一个工作

会话保存路径正在运行,正在写入文件。使用默认会话处理程序。

session.cookie_path设为/

session.cookie_lifetime设置为其他0

我没有使用session_regenerate_id

session_start( );是所有网页上的第一行代码

如果需要更多信息,我会更新这篇文章,谢谢。


关于进一步的研究,结果证明是RewriteRule的一个问题,不知道如何修复它。

此外,来自session_start( )的Cookie设置为localhost/home/,就像它是一个文件夹一样,它是一个变量localhost/index.php?page=home。因此,每个页面都有自己的session id,任何修复的想法?

1 个答案:

答案 0 :(得分:1)

不是按session_start();开始新会话,而是先检查浏览器是否已发送当前的session_id。

if (isset($_POST['session_id'])) {
    $_COOKIE['PHPSESSID'] = $_POST['session_id'];
    session_start();
} else {
    session_start();
}

如果这不起作用,那么您的PHP和/或Apache配置似乎就会被破坏。 你为什么不尝试默认配置?