php Laravel 7:为什么我的会话cookie没有在浏览器中设置?

brvekthn  于 2023-02-03  发布在  PHP
关注(0)|答案(4)|浏览(264)

我的Laravel会话cookie没有在浏览器中设置,即使服务器响应包含正确的Set-Cookie报头。Laravel服务器运行在localhost:8000,客户端应用程序是NuxtJS SPA,运行在localhost:7000。
包含Set-Cookie的响应报头如下所示:

HTTP/1.1 200 OK
Host: localhost:8000
Date: Sun, 06 Sep 2020 00:50:31 GMT
Connection: close
X-Powered-By: PHP/7.4.10
Cache-Control: no-cache, private
Date: Sun, 06 Sep 2020 00:50:31 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, PATCH, DELETE
Access-Control-Allow-Headers: Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Authorization, Access-Control-Request-Headers, Set-Cookie
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Set-Cookie: dv_session=ifhSq8WFD2Upltr5v2bzNBgaA5xx3KiDVuMWuBge; expires=Sun, 06-Sep-2020 02:50:31 GMT; Max-Age=7200; path=/

通过postman发出同样的请求,cookie被保存:

因此,浏览器似乎忽略了“Set-Cookie”标头。
我的session.php文件如下所示:

<?php

return [
    'driver' => env('SESSION_DRIVER', 'redis'),
    'lifetime' => env('SESSION_LIFETIME', 120),
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => env('SESSION_CONNECTION', null),
    'table' => 'sessions',
    'store' => env('SESSION_STORE', null),
    'lottery' => [2, 100],
    'cookie' => 'dv_session',
    'path' => '/',
    'domain' => "",
    'secure' => false,
    'http_only' => false,
];

为什么cookie保存在Postman中,但被浏览器忽略?

imzjd6km

imzjd6km1#

你的问题在chrome和safari上运行,Firefox可以帮你解决。问题是chrome不允许来自http域名的cookies,这是你的本地主机。这是他们最新发布的版本之一。
你在生产中应该没问题,因为你有一个https证书,但是对于开发,你可以使用firefox。
另一种解决方法是在session.php中将“secure”字段设置为false。

'secure' => env('SESSION_SECURE_COOKIE', false)

这在一开始是有用的,但我个人决定转移到火狐,因为这个技巧停止工作,不得不“破解我的方式”围绕这个问题,所以它更容易只是改变浏览器的发展。

zbwhf8kr

zbwhf8kr2#

我在REST API上也遇到了类似的问题。在Postman上我可以看到带有httpOnly标志的cookie,但在浏览器上什么也看不到。
我的解决方案是为请求正确设置WithCredentials选项。下面是更详细讨论的链接:Set-Cookie on Browser with Ajax Request via CORS
并将文件config/cors.php中的laravel变量supports_credentials更改为true

dgtucam1

dgtucam13#

在我的例子中,我在config/session.php中设置的域不正确
'domain' => env('SESSION_DOMAIN', env('APP_URL')),

kmpatx3s

kmpatx3s4#

我也遇到过这个问题,在我的例子中,这是因为index.php文件中的“echo”语句。问题是echo应该在所有的nessesery头文件都设置好之后执行,否则PHP就不能设置它们。

相关问题