前端生产环境请求PHP后端时$_SESSION为空,开发环境运行正常
问题原因与解决方案
跨域请求未携带身份凭证
开发环境下前端请求路径为同域下的/api,浏览器会自动携带包含PHPSESSID在内的所有Cookie,经webpack代理转发后后端可以正确识别会话。生产环境前端域为https://www.mydomain.abc,直接请求https://api.mydomain.abc属于跨域请求,默认情况下前端请求库(axios/fetch等)不会自动携带Cookie,后端接收不到PHPSESSID会每次生成新的会话,导致$_SESSION为空。
解决方法:- axios全局配置添加
withCredentials: true - fetch请求添加参数
credentials: 'include'
- axios全局配置添加
CORS配置缺失凭证允许头
跨域携带Cookie的场景下,除了配置允许的请求源外,Apache还需要返回响应头Access-Control-Allow-Credentials: true,且不能使用*作为允许的源(你当前已经配置了明确的允许源,符合要求),否则浏览器会拦截响应导致Cookie无法写入。Session Cookie属性配置不符合跨域要求
新版本浏览器默认对Cookie开启SameSite=Lax限制,跨域请求下默认不会携带Cookie,需要调整PHP的Session Cookie配置,可在session_start()之前添加如下配置:
session_set_cookie_params([ 'secure' => true, // 仅HTTPS下传输,符合生产环境的HTTPS配置要求 'samesite' => 'None', // 允许跨域携带Cookie 'domain' => '.mydomain.abc', // 可选配置,允许所有子域共享Cookie 'httponly' => true // 建议开启,防止XSS攻击窃取Cookie ]);
- 反向代理Cookie转发异常
确认前端访问后端的反向代理NGINX没有过滤Cookie请求头,也没有修改后端返回的Set-Cookie响应头,可添加如下配置确保Cookie正常传递:
proxy_pass_request_headers on; proxy_pass_header Set-Cookie;
内容的提问来源于stack exchange,提问作者Héctor
相关产品推荐
相关产品推荐

