session 重定向后丢失 header 在 safari 和 edge 中的位置(仅来自网络邮件)

session lost after redirect header location in safari and edge (only from webmail)

我在邮件里面发了一个hyperlink,目标是https://example.com/category/12345/ch3k5um/.
.htaccess 将请求导航到 index?cat=category&id=12345&checksum=ch3k5um
如果一切正常,将设置session

$_SESSION = array( 'foo' => 'bar' );

然后重定向到目标 header ('location: /target/page', true, 302);
里面有支票 isset($_SESSION['foo']).

这适用于不同的 mail-clients,如 thunderbird 或 apple-mail,适用于所有浏览器。也来自正常 login-form.

如果我在像“web.de”或“gmx.net”这样的网络邮件中单击这个 link,它会转到他们的引荐来源,而不是被调用的 link,
那里 session 将被设置 - 并重定向到 /target/page -
这里 session 丢失了,但只有在 safari 和 edge 中..

经过几个小时的努力,我找到了解决方案。

使用 header 位置重定向后丢失 session 的问题,
newsamesite”属性来自 PHP7.3.
如果这是Strict,你会失去header( 'Location: /foo' , true, 302);
之后的session 使用 Lax 很好..

此刻我不知道为什么这只发生在网络邮件中,而且只发生在 safari 和 edge 上..

脚本顶部的 session_starts:

$sessionSet = array(
    'path' => '/',
    'domain' => $_SERVER[ 'HTTP_HOST' ],
    'secure' => TRUE,
    'httponly' => TRUE,
    'samesite' => 'Lax',    //  Strict will lose the session for some reason in some case..
    'lifetime' => 18000
);
ini_set( 'session.save_path', '/dir/to/sessions' );
ini_set( 'session.cookie_lifetime', $sessionSet[ 'lifetime' ] );
ini_set( 'session.gc_maxlifetime', $sessionSet[ 'lifetime' ] );
ini_set( 'session.gc_probability', 1 );
ini_set( 'session.gc_divisor', 3 );
ini_set( 'session.cookie_samesite', $sessionSet[ 'samesite' ] );
session_set_cookie_params( $sessionSet );
session_start();