PHP 页面加载时重置会话 ID

PHP Session Id Reset on page load

我查看了这里和其他地方的所有内容,似乎没有任何效果!

这是问题所在:

PHP 版本为:5.6.30-0+deb8u1

我做了一个小脚本来在应用程序之外复制:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

echo '<pre>';
echo 'orig session.cookie_domain = '.ini_get('session.cookie_domain').PHP_EOL;
echo 'orig session.cookie_secure = '.ini_get('session.cookie_secure').PHP_EOL;
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_secure', 'Off');
echo 'new session.cookie_domain = '.ini_get('session.cookie_domain').PHP_EOL;
echo 'new session.cookie_secure = '.ini_get('session.cookie_secure').PHP_EOL;
echo '-------------'.PHP_EOL;
print_r($_COOKIE);
session_start();
print_r($_COOKIE);
setcookie(ini_get('session.name'), session_id(), 0, '/', ini_get('session.cookie_domain'), false, false);
print_r($_COOKIE);
echo '-------------'.PHP_EOL;
echo 'session id: '.session_id().PHP_EOL;
echo '-------------'.PHP_EOL;
$_SESSION[session_id()][] = date('Y-m-d H:i:s');
print_r($_SESSION);
echo '</pre>';
//phpinfo();

脚本的输出是:

orig session.cookie_domain = 
orig session.cookie_secure = 
new session.cookie_domain = .mydomain.com
new session.cookie_secure = Off
-------------
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
Array
(
    [__cfduid] => ddxxx
    [_ga] => GA1.2.xxxx
    [wp-settings-time-2] => 1500996194
    [_gid] => GA1.3.xxxx
)
-------------
session id: 7n4mm16s525mpqo99r242p90l3
-------------
Array
(
    [7n4mm16s525mpqo99r242p90l3] => Array
        (
            [0] => 2017-08-07 16:01:18
        )

)

执行此操作以保留现有会话:

if(session_status() !== PHP_SESSION_ACTIVE) {
    session_start();
}

经过大量研究,发现问题出在清漆缓存上。问题在于 Varnish 在没有设置会话 cookie 的情况下缓存页面,使其在刷新页面后无用。

在服务器上禁用 Varnish 解决了我的问题。

对于那些希望保持 Varnish 活跃但让会话工作的人也发现了这一点:Cache-Control Header Fix

检查 php 文件中的 is_writable(session_save_path()):

<?php
if (!is_writable(session_save_path())) {
    echo 'Session path "'.session_save_path().'" is not writable for PHP!';
    // you need set chmod -R 777 [session save path folder]
}

希望能帮到你