Laravel 5.4中的Laravel Session在每次刷新/请求时都会更改。

20
标题已经说得很清楚了,我正在使用Laravel 5.4、PHP 7.1,在我的本地机器上会话正常工作。但是每次尝试登录或重新加载页面时,都会获得一个新的CSRF令牌,这会破坏一切。我使用数据库作为我的会话驱动程序,并且它在我进行的每个请求中都创建一个新的条目。这在我第一次升级时发生在我的本地机器上,但要修复它的解决方案是更新我的cookie_domain env变量,我已经解决了。但是在我的新服务器上,我尝试了所有我能想到的域名,它仍然不起作用。 我认为这是某种配置问题,但我不知道是哪里的问题。如果有帮助的话,查看我的初始页面加载的响应标头,sid和laravel会话都出现在“Set-Cookie”命令下,但实际上都没有保存到本地应用程序cookie存储中。
现在我的设置是这样的,我有3个服务器,所有这三个服务器都运行在克隆的映像上,这意味着它们是相同的,但其中一个是子域,development.mysite.com,另外2个负载均衡用于主站点mysite.com。因此,我能想到的唯一可能的解释是,由于我的子域,某种方式Laravel无法理解我的设置。我尝试了.env文件中COOKIE_DOMAIN的所有可能组合(development.mysite.com、.mysite.com、mysite.com、.development.mysite.com等),并添加了许多选项到我的主机,但都无济于事。你对此有什么想法?
此外,我发现它可能与我使用的域名是子域有关,其中主域也在运行Laravel,如果是这样,我将不得不弄清楚原因。

1
我曾经遇到过同样的问题,我认为这个问题只是在本地出现,当你更换浏览器时它就会消失。 - ako
你修好了吗? - Saeesh Tendulkar
5个回答

14

我们也遇到了这个错误,以下是似乎可以解决问题的方法:

• 检查您的 storage/ 文件夹权限是否正确

• 尝试禁用页面中的所有JavaScript(通过导航器或代码内部禁用),并确保 'http_only'= > true,

• 尝试使用带有和不带有HTTPS的协议

• 确保SESSION_DRIVER变量不为空

• 尝试在'encrypt' => false,'encrypt' => true,之间切换

• 尝试更改cookie名称 'cookie' => 'laravelsession',

• 将 SESSION_DOMAIN 设置为实际域名或null

• 在'secure' => env('SESSION_SECURE_COOKIE', false), and 'secure' => env('SESSION_SECURE_COOKIE', true),之间切换

每个步骤后,这个错误似乎都被解决了,但是不知何故,有时我们只有在开发环境中使用HTTPS时才能在浏览器中设置cookie。

很抱歉不能提供100%的解决方案,但是因为我也遇到了完全相同的问题,所以想要向您分享我的经验。


记录一下,这与我的问题完全无关,我的问题与子域有关,任何寻找答案的人都可以在这里找到解决方案 https://github.com/laravel/framework/issues/19109 - CMOS
我爱你。你刚刚救了我的命。 - Nick
“secure”配置让我头疼。很久以前,某人(我)在生产环境中将其硬编码为true,这当然在开发环境(本地主机)中不起作用。我真是太傻了。 - apito
谢谢你,@Mathieu,这个可以用。你节省了我的时间 :) - Martin Adiputra

7
我找到了解决方法,它分为两部分,不确定为什么会有差异,因为操作系统和设置是一样的。
第一步,请确保COOKIE_DOMAIN被正确设置且没有端口号(无论您使用.env还是直接在/config/session.php中设置)。
第二步,请确保/config/sessions.php中的cookie名称('cookie' => 'whatever')没有下划线。很明显,Laravel存在这个问题。

2
COOKIE_DOMAIN还是SESSION_DOMAIN - Muhammad Raheel
对我来说,问题是在 cookie 名称中有一个“.”(点)(在本地开发服务器上使用 Ubuntu 19.10 上的 Laravel 6.2)。你指引了我正确的方向。 - Sir_Faenor

3
这个问题的主要原因是Laravel无法在服务器端保存会话数据。
使用文件作为会话存储时,通常是权限问题[如果您正在使用CentOS,请检查SELINUX],Laravel(也就是Apache或Nginx或您的进程运行的任何用户)应该对存储会话文件的文件夹[通常是项目根目录/ storage文件夹]具有读写权限。
另一个原因是当您将数据库用作会话存储并手动创建会话表并犯了类型不匹配的错误时,例如将id列设置为bigint(20)。
这意味着Laravel无法存储会话数据。请参阅我关于此的详细答案 https://stackoverflow.com/a/45340647/7260022
最后一点是关于cookie和域设置,如上所述。希望这能帮助任何未来遇到此问题而苦苦挣扎的人找到问题所在。

1
我在Laravel 5.6中遇到了类似的问题。我的应用程序一直正常运行,从未出现过身份验证方面的问题。突然间,我收到了一个 "419 | 页面已过期" 错误,并且每次刷新都会生成新的CSRF令牌。
最终,我发现浏览器阻止了应用程序设置的cookie。虽然我还没有找到永久解决方法,但允许或删除这些被阻止的cookie暂时解决了问题。
我没有更改过我的config/sessions.php*配置文件,在本地服务器上该应用程序工作良好。

0

如果您使用nginx,请禁用缓存。对我来说,这解决了同样的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接