https cookie不正确问题导致无法登录

前端每次请求,后端都会返回一个Set-Cookie,里面都包含一个PHPSESSID=b0fqk0jj73ajkhb0qk2buh6grr这种数据,导致每次覆盖浏览器cookie


后端这里用的是tp框架,问题是因为前端请求header头没有强制带cookie参数导致的,https请求每次带上cookie参数就解决了,下面是https cookie问题的一些情况分析

  1. Cookie安全设置:在HTTPS下,如果之前设置的Cookie有Secure属性,那么只有HTTPS请求才会携带该Cookie。而如果当前请求没有携带Cookie(因为Secure属性导致HTTP无法写入,或者跨域问题导致Cookie未发送),那么服务器每次都会生成一个新的Session ID并通过Set-Cookie返回。

  2. 跨域请求的Cookie处理:前端使用HTTPS接口,且涉及跨域(从HTTP到HTTPS或者不同域名),需要确保前端请求携带了Cookie(设置withCredentials为true),并且后端响应头中Access-Control-Allow-Origin不能为通配符"*",必须指定域名,同时要设置Access-Control-Allow-Credentials为true。

  3. Session配置:检查PHP的Session配置,确保session.cookie_secure选项在HTTPS下设置为On(但如果是混合环境,可能需要调整)。同时,检查session.cookie_domain设置是否正确,以确保Cookie在正确的域名下被发送。

  4. TP框架的Session设置:在TP框架中,可能需要在配置文件中设置Session的secure和httponly等参数。例如:
    'session' => [
    'id' => '',
    'var_session_id' => '',
    'prefix' => 'think',
    'type' => '',
    'auto_start' => true,
    'secure' => true, // 确保在HTTPS下设置为true
    'httponly' => true,
    'use_trans_sid' => false,
    'domain' => '.yourdomain.com', // 设置域名
    ],

  5. 每次请求都生成新的Session ID:如果服务器没有接收到客户端发送的Session ID,或者接收到的Session ID无效,那么服务器会生成一个新的Session ID。因此,确保客户端每次请求都正确携带了Session Cookie。

  6. 检查跨域请求的Cookie发送:前端请求需要设置withCredentials,例如使用XMLHttpRequest时:
    xhr.withCredentials = true;
    使用fetch时:
    fetch(url, { credentials: 'include' })

  7. 后端响应头:确保后端在响应跨域请求时,Access-Control-Allow-Origin不能使用通配符,必须指定明确的域名,并且设置Access-Control-Allow-Credentials为true。

根据你提供的PHP入口文件设置的跨域头,已经设置了Access-Control-Allow-Credentials: true,并且Access-Control-Allow-Origin设置了具体的$origin(注意不能为通配符),这符合要求。

  1. 检查Cookie的Domain和Path:确保每次Set-Cookie的Domain和Path与之前的一致,否则浏览器会视为不同的Cookie而进行存储,而不是覆盖。但如果是同一个域名和路径,那么每次Set-Cookie会覆盖之前的。

  2. 检查HTTPS下的Cookie加密:有些情况下,如果服务器证书有问题,可能会导致Cookie无法被存储,但这种情况比较少见。

  3. 查看TP框架的Session初始化:检查是否每次请求都重新初始化了Session,导致无法正确读取到客户端传来的Session ID,从而生成新的Session。

建议的排查步骤:

a. 检查前端请求是否携带了Cookie:在开发者工具中查看请求头中是否有Cookie字段,并且包含之前的PHPSESSID。

b. 检查后端接收到的Cookie:在TP框架中,打印接收到的Cookie,看看是否有PHPSESSID。

c. 检查后端响应头:查看每次响应是否都返回了Set-Cookie,并且PHPSESSID的值是否在变化。

d. 检查Session配置:确认Session的secure配置,在HTTPS下需要设置为true,但也要注意如果同时需要HTTP和HTTPS,可能需要调整(建议全站HTTPS)。

e. 检查Session的生存周期:是否设置了很短的生存时间,导致Session很快过期,从而需要重新生成。

f. 检查跨域情况:确保前端请求的域名与后端设置的Access-Control-Allow-Origin一致,且没有使用通配符。

由于之前HTTP没有问题,切换到HTTPS后出现问题,很可能是因为Cookie的Secure属性导致。在HTTPS下,如果Cookie被标记为Secure,那么它只能在HTTPS连接下被发送。而如果服务器在HTTPS响应中设置Cookie时没有设置Secure属性,那么浏览器可能会拒绝存储(或者不会在后续请求中发送),导致服务器每次都会设置新的Cookie。

因此,确保在HTTPS环境下,设置Cookie时添加Secure属性。在TP框架中,可以通过配置Session的secure为true来实现。

另外,也要注意SameSite属性,如果设置为Strict或Lax,可能会影响跨站请求的Cookie发送。如果前端和后端不是完全同域(例如不同的子域名),可能需要设置SameSite为None(同时必须设置Secure属性)。

总结:问题很可能是因为在HTTPS下,Cookie的Secure属性设置不当,或者跨域请求中Cookie的发送和接收配置有问题。建议按照上述步骤排查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值