为什么切换服务器后,Laravel会话仅在Safari和IE中失败


Why would Laravel Sessions fail in just Safari and IE after switching server?

带有Webmin、Apache Centos 6、Laravel应用程序和旧数据库模式的新VPS服务器。在旧的共享主机上运行良好,但由于某种原因,在VPS上Laravel的会话存储(Laravel 3.0)不再在Safari或Internet Explorer上运行。

会话ID似乎没有保存在客户端上。强制Laravel会话ID保存在客户端浏览器上的好方法是什么?

Safari/IE存储cookie的方式与Chrome/Firefox运行良好时可能会产生此问题的方式有什么不同?

如果服务器上的时间/时区不正确,Cookie可能会受到干扰。检查服务器上的时区/时间设置。

请注意,您需要检查操作系统中的实际时间/时区,而不仅仅是PHP中的时区。但是,您可以通过将PHP中的时区(date_default_timezone_set())设置为您的本地时间并询问PHP的日期来验证使用PHP;如果不匹配,则服务器设置不正确。请注意,在PHP中调整时区以使其看起来正确并不能解决cookie问题,您必须在操作系统中使用"日期"正确设置操作系统时间/时区。

另一种验证问题是否存在的方法是:将cookie设置为一年后过期——它们会显示吗?如果时区错误,则会显示(>时区差异),但2小时的cookie可能不会(

原因:由于cookie是使用实际时间设置的(即"此cookie将于2013年7月25日15:13 GMT到期")。如果您的本地计算机与服务器的设置不同,则cookie可能在发送之前就已过期。一些浏览器对此进行了更正(FF过去是这样,Chrome现在也可能是这样)。

由于这里更改的是服务器,请检查服务器上的时间。(还要仔细检查一下你自己的电脑,看是否合适)。

这是一个经典的IE/Safari跨域/iframe问题。

Laravel IE iframe cookie问题的潜在解决方案(对我有效)。只需在筛选后将其添加到您的应用程序中即可。

App::after(function ($request, $response){
  $response->header('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS"');
});

你甚至可以指定,对于哪条路线,你需要这个标题,对我来说,它是/external/之外的一切,所以代码看起来像这样:

App::after(function ($request,$response){
    if($request->is('external/*')){
        // IE iframe cookie fix
        $response->header('P3P', 'CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
    }
});

我有这个问题,我这样解决它:我的.htaccess不会将example.com重定向到www.example.com,我想去的url也没有www,但我登录了www.example.com.

取而代之的是:

ajax:{
 url: "https://example.com" + "/user_list"
 }

我用过这个:

ajax:{
 url: "https://" + window.location.hostname + "/user_list"
 }

使用此替换,您将继续使用您输入的任何地址。有或没有";www";

您需要检查新服务器上的所有内容是否与旧服务器相同。。。一个旧版本或更新版本的软件可以做到这一点,甚至可能是不同的htaccess设置
还有两件事需要考虑
也许文件在移动过程中损坏了。。。或者服务器端有什么东西把事情搞砸了。。。我曾经使用的免费托管公司有弹出窗口,因为这些弹出窗口,你不能使用常规的网站地图进行谷歌索引,因为弹出窗口会给你的页面注入一些东西。

我也刚刚发现了这个。。。会话不会初始化或记住请求之间的状态

我不知道的是,对setcookie的调用会自动添加前缀带有句点(.)以表示兼容性的域。在根级别上域名,它将允许在所有子域。它没有意识到这一点,给了我2个会话cookie和大混乱发生了。

似乎有两种方法可以解决这个问题:

Set the cookie configuration value to something else.
Set the domain to "www.example.org" so that it is only available to the root-level domain name.

这个[解决]会话有时不会在请求之间持久存在