php - 将 cookie 发送到服务器时遇到问题
问题描述
vue+axios 前端不会在请求标头中将 cookie 发送到我的 php 服务器。
我正在尝试将旧项目移动到新服务器。我对项目架构做了一些优化,它在我的本地 docker 环境中运行良好。当我将它移到生产环境时发生了一些问题。每边有两个域。admin.example.com 用于前端,serve.example.com 用于后端。我在服务器代码中手动将 cookie_path 设置为 / 并将 cookie_domain 设置为 .example.com 。前端在后端响应标头中获得了预期的 set-cookie。但是前端不会在每个下一个请求中将 cookie 发送到后端。所以登录状态无法维持。
const service = axios.create({
baseURL: process.env.BASE_API,
timeout: 15000,
withCredentials: true,
transformRequest: [function (data) {
let ret = ''
for (let it in data) {
ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
}
return ret
}],
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
})
// code
session_set_cookie_params(
C('COOKIE_EXPIRE'),
C('COOKIE_PATH'),
C('COOKIE_DOMAIN'),
C('COOKIE_SECURE'),
C('COOKIE_HTTPONLY')
);
session_name(C('SESSION_NAME'));
// config
'SESSION_NAME' => 'xxxxx',
'COOKIE_EXPIRE' => 3600,
'COOKIE_DOMAIN' => '.example.com',
'COOKIE_PATH' => '/',
'COOKIE_PREFIX' => '',
'COOKIE_SECURE' => false,
'COOKIE_HTTPONLY' => false,
响应头如下:
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:DNT,X-Token,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding
Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE
Access-Control-Allow-Origin:http://admin.example.com
Set-Cookie:beb257200166c10f69c4667d621785f7=9m7e9lonmjtvh06fn3fi0nul71; expires=Thu, 08-Aug-2019 13:29:29 GMT; Max-Age=3600; path=/; domain=.example.com
X-Content-Type-Options:nosniff
预期结果:浏览器在每个请求中发送 cookie,以便保持登录状态。
实际结果:Cookie 尚未发送。浏览器在每个请求中获得不同的会话密钥。
解决方案
我昨晚才发现我犯了一个愚蠢的错误。我和我的朋友正在与这个项目一起工作。他在我们的前端服务器上部署了他的前端代码。这就是为什么浏览器永远不会在请求标头中将 cookie 发送到后端的原因,无论我在前端和后端都做了什么。在这种情况下,你只需要做两件事。
在后端响应标头中发送“Access-Control-Allow-Credentials:true”和“Access-Control-Allow-Origin:frontend_domain”。请注意,在这种情况下,不允许将 Access-Control-Allow-Origin 设置为 *。
在您的 axios 配置中设置“withCredentials:true”。此键的默认值为 false。这是在 cors 请求中启用 axios 发送 cookie 的设置。你可以在这里获得更多信息
推荐阅读
- java - How to Pre Process Json String in Java :: Convert Capitalised Field names to lowerCase Camel case names
- b2b - 实施tripadvisor旅行者评级
- java - 从firebase检索多个数据返回null
- c++ - 在递归函数中声明一个静态变量。堆栈溢出
- ms-access - 将数据表从 Access 2003 转移到 2013
- objective-c - 如何使用地址(指针)从 lldb 调用 swift 函数?
- html - 菜单文本长中断 - 适合下一行
- google-cloud-platform - 使用 Google Genomics Pipelines CLI 自定义机器类型
- c - Lex 程序不执行任何操作
- svg - Safari 中带有非虚线标记的 SVG 虚线