昨晚给博客上了伪静态,URL 从 /index.php/archives/53/ 变成 /archives/53/,清爽。
今天一开电脑,后台登不进去。
第一反应是被黑。也不冤——前阵子刚暴露过源站 IP,后台又偏偏上不去,挂马、劫持、拖库的剧本在脑子里已经过了一遍。
但我没急着敲命令,也没去翻日志。我干了件更省事的事:截了张图,甩给豆包。
它看了一眼:你是不是开了伪静态?
我愣了一下——还真是。
然后我登录宝塔,把伪静态规则复制给它,它重写了一份,我贴回去,网站就恢复了。
就这么简单。前面那出"被黑"的大戏,纯粹是自己吓自己。
不过事后我把原因搞明白了,免得下次再翻车,记一下。
坑一,重写规则掉了。这套规则本该有四段:放行后台入口、老链接 301、真实文件直连、其余丢给 index.php。线上不知道什么时候只剩下了那条 301,请求跳到新地址之后就没人接了,干净 URL 没有任何规则处理,nginx 直接 404。迷惑就迷惑在首页还是 200——它是现成的 index.php。所以"后台进不去"只是整站半死的一个表现,我刚好先撞上后台。
坑二,那条 301 把后台登录也 301 了。这才是后台进不去的真正原因。Typecho 后台的登录表单是 POST 到 /index.php/action/login,而"老链接 301"不分青红皂白,任何 /index.php/... 进来都 301,登录的 POST 也被跳去了 /action/login。POST 撞上 301,浏览器会把它降级成 GET 再发一次,带着账号密码的请求体就没了。后台收到一次空 GET,当然登不进。
豆包给的那版,核心就是三件事——先放行、再 301、最后补回重写:
plain
复制
1) 后台/接口入口放行(POST 不能被 301)
if ($request_uri ~ ^/index.php/(admin|action)) { break; }
2) 老链接 301 → 干净 URL(保收录)
if ($request_uri ~ ^/index\.php/(.*)$) { return 301 /$1; }
3) 真实存在的文件/目录直接返回
if (-f $request_filename) { break; }
if (-d $request_filename) { break; }
4) 其余交给 index.php 路由
if (!-e $request_filename) { rewrite ^(.*)$ /index.php$1 last; }
改完 reload,别只看首页,按这张单子挨个验:文章 /archives/N/ 200;分类、/feed/、/sitemap.xml 200;老链接 /index.php/archives/N/ 301 到新地址;后台登录真点一次,能进。
三条教训:给 Typecho 加"老链接 301",必须放行 /index.php/action 和 /index.php/admin,不然 POST 登录被 301 成 GET,账号密码凭空消失;验伪静态别只 curl 200,要真跑一遍后台登录;改 URL 规则前先分清"被黑"和"路由坏了",首页活着、文章全 404,基本就是重写的问题。
以后再有"后台突然进不去",我大概会先看一眼首页和文件时间戳,再决定要不要慌。
评论