|
|
这两天踩到个坑:老站用的 xiuno,突然有一天后台就是死活进不去。账号密码肯定没错,输入后要么原地刷新毫无反应,要么提示登录成功却又跳回登录页。折腾一圈,顺手把排查过程和一些心得记下来,给遇到同样问题的朋友一个参考。
先说最容易忽略的一点:服务端时间和时区。xiuno 登录依赖 session/cookie 校验,如果服务器时间飘了(比如 NTP 没同步,或时区从 UTC+8 变成了别的),cookie 过期判断会异常,结果就是“看似登录了,其实马上被判过期”。我那台机器用 timedatectl 一看时间差了几分钟,同步一下再重启 php-fpm,后台立刻能进。这个问题隐蔽但高频,尤其是搬迁或重启后。
第二个常见原因是 cookie 域与路径配置不匹配。比如站点从 www 切到裸域,或者 http 升级到 https,但 conf 里没改。浏览器虽然写了 cookie,却在管理路径下不发送,于是每次请求都像新会话。检查下 config 里的 cookie_domain、cookie_path,以及 nginx 的 server_name 和跳转逻辑,统一成一套。顺带清一次浏览器站点数据,排除脏 cookie 干扰。
第三类是 session 存储问题。xiuno 可能用文件或 Redis/Memcached。文件模式下,注意 php.ini 的 session.save_path 是否可写、inode 是否爆满、磁盘是否只读。Redis 模式下,连通性、认证配置、key 过期策略都要核对。一个快速验证法:在登录页前后加个临时脚本,var_dump(session_id()),看是否稳定;如果每次请求都变,那就是 session 无法持久化。
还有一个坑来自反向代理和 HTTPS。代理没透传或重写了 Set-Cookie 导致 SameSite/Secure 标记异常,浏览器就不带 cookie。看下响应头里 Set-Cookie 是否带 Secure(在 https 下必须有),SameSite=Strict 对跨站跳转会比较苛刻,通常 Lax 更稳妥。Nginx behind CDN 时注意 proxy_set_header X-Forwarded-Proto https,避免应用层误判协议。
插件与代码改动也别放过。某些安全/防火墙类插件会在登录动作上加验证码或频控,升级或报错后卡住认证流程,表象就是“永远回登录页”。办法是暂时在数据库里禁用可疑插件,或者直接把 plugin 目录里最近改动的插件先挪走再试。主题模板里改过登录页也可能埋雷,换回默认模板能快速定位是否模板问题。
数据库连接与表结构异常偶尔也会触发登录失败。特别是用户表 utable 的索引损坏或字段不一致,认证逻辑查询不到正确行。看下 PHP 错误日志和数据库慢查询,必要时做一次表修复。顺便确认站点 URL 配置和实际访问域一致,避免“登陆后跳转到另一个域名下又失效”的循环。
如果你是从 http 升级到 https 后才出问题,优先排查混合内容、301 跳转链和 HSTS。最佳实践是:强制 https,统一域名到单一入口,应用内 base_url 只保留 https 域名;清理浏览器 HSTS 记录或换个浏览器测试,排除缓存导致的假象。
实在不行,可以从“降维打击”入手:开启 PHP display_errors 或看 error_log;抓包看登录请求与响应头的 Set-Cookie/Location;浏览器应用面板观察 cookie 是否写入、作用域是否正确;服务器上 tail -f 观察 Nginx/Apache、php-fpm 日志是否有 500/权限错误。逐层核对,比盲目改配置靠谱得多。
最后给一套简化清单:
- 校准服务器时间/时区,重启 php-fpm。
- 统一域名与协议,校对 cookie_domain、cookie_path;清理浏览器站点数据。
- 确认 session 存储可用(文件权限/Redis 连接),观察 session_id 是否稳定。
- 检查代理/HTTPS 头与 Set-Cookie 标记,确保 Secure 与合理的 SameSite。
- 临时禁用最近安装或升级的插件与自定义模板。
- 查 PHP/Nginx/数据库日志,必要时修复相关表或还原最近代码改动。
xiuno 本身很轻,问题多半出在运行环境与会话配置上。按上面顺序排一遍,大概率不用重装就能把后台救回来。 |
|