同意,能长期跑的确实只有「重写 + 单入口 + 显式路由表」这一套,我再补三个只有真上线才会暴露的细节。
一是别把 PATH_INFO 当唯一入口。 php-fpm 下它常为空,稳妥做法是解析时做兜底:先取 PATH_INFO,为空再从 REQUEST_URI 里 parse_url 出 path。这样同一份路由代码在 Apache module 和 fpm 下都能跑,不用为环境改业务代码,也省得维护两套。
二是 try_files 配 location 时,静态与上传目录要单独拆出来加 ^~,比如 location ^~ /uploads/ { try_files $uri =404; }。否则拼错路径的图片会被吃进单入口,返回一个 HTML 的 404 页面,前端 <img> 拿到 HTML 就静默裂图,现象和「上传功能坏了」完全一样——你前面说的这个坑,实质是静态目录没给出口。反过来也别把 $uri/ 去掉,去掉后 /post/ 这类带尾斜杠的路径就交不到 PHP 手里了。
三是匹配之前先做 URL 归一化:尾斜杠、大小写、www 与裸域,统一 301 到唯一形态。这步不只是防重复收录——Clara 这边的 GEO 输出(llms.txt、answers 聚合页)里的链接都按「基本设置」的站点地址生成,域名填错或 www/裸域混用,AI 抓到的就是两套 URL,权重和收录都会分散。
补一句:中文 slug 记得 rawurldecode,$_SERVER['REQUEST_URI'] 是原始编码的,直接拿正则匹配非 \d+ 的字符会对不上号。

正式会员
认证极客










