You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Chrome会话每次重建时PHP用户点击追踪器的适配问询

解决Android Chrome中PHP追踪器会话重复重建的问题

这问题我之前做用户行为追踪时也踩过坑——Android Chrome对图片资源(比如你的pixel.php返回的1x1像素图)的请求处理有特殊逻辑,默认会限制会话Cookie的携带,导致每次请求都重建Session。核心原因有两个:

  1. Android Chrome会对图片请求启用无Cookie缓存,如果浏览器判定资源可缓存,就不会携带Session Cookie发起请求;
  2. PHP默认的Session Cookie是临时会话Cookie(关闭浏览器即失效),Chrome移动端的隐私策略会优先清理这类Cookie,尤其是应用后台挂起后。

下面是针对性的解决方案,直接修改你的pixel.php即可:

方案1:改用持久Cookie替代Session追踪

Session依赖PHPSESSID Cookie,而这个Cookie在Android Chrome的图片请求中极易丢失。换成持久Cookie能大幅提升追踪的稳定性:

// 1. 强制浏览器每次都发起请求,不使用缓存
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

// 2. 返回像素图
header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));

// 3. 持久Cookie追踪逻辑
$domain = $_SERVER['HTTP_HOST'];
$trackCookieName = 'user_track_id';

if (!isset($_COOKIE[$trackCookieName]) || empty($_COOKIE[$trackCookieName])) {
    // 生成高唯一性的用户追踪ID
    $trackId = uniqid('track_', true) . bin2hex(random_bytes(8));
    // 设置30天有效期的Cookie,适配Chrome的隐私规则
    setcookie(
        $trackCookieName,
        $trackId,
        time() + 30 * 86400, // 30天有效期
        '/',
        $domain,
        isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on', // HTTPS站点开启Secure属性
        true // 开启HttpOnly,防止前端脚本篡改
    );
    // 执行新用户插入逻辑
    // 示例:$pdo->prepare("INSERT INTO user_tracks (track_id, created_at) VALUES (?, NOW())")->execute([$trackId]);
} else {
    $trackId = $_COOKIE[$trackCookieName];
    // 执行老用户活跃更新逻辑
    // 示例:$pdo->prepare("UPDATE user_tracks SET last_active = NOW() WHERE track_id = ?")->execute([$trackId]);
}

方案2:修复Session Cookie属性(若坚持用Session)

如果必须依赖Session,需要调整Session Cookie的参数,让Chrome愿意保留它:

// 在session_start()前配置Session Cookie属性
session_set_cookie_params([
    'lifetime' => 86400, // 设为1天有效期,不再是临时会话
    'path' => '/',
    'domain' => $_SERVER['HTTP_HOST'],
    'secure' => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on',
    'httponly' => true,
    'samesite' => 'Lax' // 若像素嵌入第三方网站,需设为'None'并配合secure=true
]);
session_start();

// 同样添加缓存控制头,避免浏览器缓存请求
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');

// 返回像素图
header('Content-type: image/png');
echo gzinflate(base64_decode('6wzwc+flkuJiYGDg9fRwCQLSjCDMwQQkJ5QH3wNSbCVBfsEMYJC3jH0ikOLxdHEMqZiTnJCQAOSxMDB+E7cIBcl7uvq5rHNKaAIA'));

// 原追踪逻辑
if (!isset($_SESSION['track']) || $_SESSION['track'] == '') {
    $_SESSION['track'] = "New User";
    // 新用户插入代码
} else {
    $_SESSION['track'] = "Old User";
    // 老用户更新代码
}

关键注意事项

  • 缓存控制是核心:必须添加Cache-Control等头,否则Android Chrome会缓存图片请求,根本不会发送Cookie;
  • HTTPS优先:HTTP站点下Chrome对Cookie的限制更多,建议尽快升级到HTTPS;
  • SameSite属性适配:如果像素图嵌入第三方网站(比如广告追踪),需将SameSite设为None,但必须同时开启secure=true,否则浏览器会拒绝该Cookie。

内容的提问来源于stack exchange,提问作者Gracie williams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:42