Laravel 7:为什么我的 session cookie 没有在浏览器中设置?
Laravel 7: Why isn't my session cookie getting set in a browser?
我的 Laravel session cookie 没有在浏览器中设置,即使服务器响应包含正确的 Set-Cookie
header。 Laravel 服务器是 运行 localhost:8000,客户端应用程序是 NuxtJS SPA 运行 localhost:7000。
包含Set-Cookie
的响应header如下:
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=/
通过邮递员发出相同的请求,cookie 被保存:
因此,浏览器似乎忽略了 'Set-Cookie' header。
我的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 中,但被浏览器忽略?
您的问题出现在 chrome 和 safari 中。 Firefox 将与您合作。问题是 chrome 不允许来自 http 域的 cookie,这是您的本地主机。这是他们的最新版本之一。
您在生产环境中应该没问题,因为您将在那里获得 https 证书。但对于开发,您可以使用 firefox。
另一个 work-around 在 session.php
中将 'secure' 字段设置为 false。
'secure' => env('SESSION_SECURE_COOKIE', false)
这最初用来解决这个问题,但我个人决定转向 firefox,因为该方法停止工作并且不得不“破解我的方式”来解决这个问题,因此只需更改浏览器进行开发就更容易了。
我在使用 REST api 时遇到了类似的问题。通过邮递员,我能够看到带有 httpOnly 标志的 cookie,但在浏览器中什么也看不到。
我的解决方案是为请求正确设置 withCredentials 选项。
这里是link更详细的讨论:
Set-Cookie on Browser with Ajax Request via CORS
并在文件 config/cors 中将 laravel 变量 supports_credentials 更改为 true。php
就我而言,我在 config/session 中设置的域不正确。php
'domain' => env('SESSION_DOMAIN', env('APP_URL')),
我的 Laravel session cookie 没有在浏览器中设置,即使服务器响应包含正确的 Set-Cookie
header。 Laravel 服务器是 运行 localhost:8000,客户端应用程序是 NuxtJS SPA 运行 localhost:7000。
包含Set-Cookie
的响应header如下:
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=/
通过邮递员发出相同的请求,cookie 被保存:
因此,浏览器似乎忽略了 'Set-Cookie' header。
我的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 中,但被浏览器忽略?
您的问题出现在 chrome 和 safari 中。 Firefox 将与您合作。问题是 chrome 不允许来自 http 域的 cookie,这是您的本地主机。这是他们的最新版本之一。
您在生产环境中应该没问题,因为您将在那里获得 https 证书。但对于开发,您可以使用 firefox。
另一个 work-around 在 session.php
中将 'secure' 字段设置为 false。
'secure' => env('SESSION_SECURE_COOKIE', false)
这最初用来解决这个问题,但我个人决定转向 firefox,因为该方法停止工作并且不得不“破解我的方式”来解决这个问题,因此只需更改浏览器进行开发就更容易了。
我在使用 REST api 时遇到了类似的问题。通过邮递员,我能够看到带有 httpOnly 标志的 cookie,但在浏览器中什么也看不到。
我的解决方案是为请求正确设置 withCredentials 选项。 这里是link更详细的讨论: Set-Cookie on Browser with Ajax Request via CORS
并在文件 config/cors 中将 laravel 变量 supports_credentials 更改为 true。php
就我而言,我在 config/session 中设置的域不正确。php
'domain' => env('SESSION_DOMAIN', env('APP_URL')),