Safari v16.4 (MacOS) 的最新更新不会在我维护的 Laravel (PHP) 应用程序中维护会话,它会随机注销用户并且不会维护购物车中的项目。
这是在 Apple 开发者论坛中报告的 - https://developer.apple.com/forums/thread/728137 这里有一个 Webkit 错误报告 - https://bugs.webkit.org/show_bug.cgi? id=255524,但据我所知没有解决方法。
Webkit 票证中提到的一种可能的解决方法是将 SameSite 属性从“松散”更改为“无”,这修复了 Safari 上的问题,但破坏了最新版本的 Chrome 上的会话行为,通常不推荐使用。
我们处理会话或 cookie 的方式是否有另一种方法可以解决此问题,或者这是否真的是一个 Webkit 错误,在通过 Safari 更新解决问题之前无法解决?
虽然这并不理想,但您可以将 SameSite 配置为仅针对有问题的 Safari 实现:
首先覆盖内置的StartSession中间件。
namespace App\Http\Middleware;
use Illuminate\Session\Middleware\StartSession as FrameworkStartSession;
class StartSession extends FrameworkStartSession {
protected function addCookieToResponse(Response $response, Session $session)
{
// Maybe use something a bit more sophisticated here like e.g. detecting only the buggy versions
if (Str::contains(request()->server('HTTP_USER_AGENT'), 'Safari')) {
config([ 'session.same_site' => 'none' ]);
}
return parent::addCookieToResponse($response, $session);
}
}
然后在您的
app/Http/Kernel.php
中用您自己的覆盖替换StartSession
下的web
中间件。
这应该让其他浏览器像以前一样运行。
您也可以将相同的逻辑放在服务提供者中,但如果您使用的是 Laravel Octane,那将不起作用。中间件应该适用于所有情况。