论坛首页能开、帖子却 404 怎么办?伪静态排查指南
首页能正常打开、帖子却是 404,基本可以直接断定:PHP 和 MySQL 都没问题,故障点只可能在「伪静态重写」这一环——服务器没有把`.html`这类非静态文件的请求转发给 index.php,于是直接甩出 404。结论:Clara BBS 不需要你写复杂规则,只要让服务器把「不是真实存在的文件/目录」的请求统一交给 index.php,帖子页立刻恢复。
先确认一件事:是服务器 404,还是程序 404
这一步能帮你省掉一半排查时间。打开一个具体的帖子链接,看 404 页面长什么样:
- 是 Nginx / Apache 自带的默认 404 页(白底黑字、写着 nginx 或 Apache)→ 请求根本没进到程序,就是伪静态没生效,往下看配置章节。
- 是网站自己的样式、带着站点导航的 404 页 → 程序已经跑起来了,问题不在伪静态。这时要看帖子本身的状态,比如是否已被前台删除(Clara BBS 前台删除是软删除,会进回收站保留 30 天,后台「帖子管理→状态筛选→回收站」可恢复),或所在版块的浏览权限发生了变化。
Nginx:一行 try_files 就够了
Clara BBS 的 URL 是系统自动识别的`.html`后缀形式,服务器侧不做任何「美化」,只做转发。规则等价于一句话:文件存在就直接返回,不存在就交给 index.php。
在站点的 server 块里加上:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
改完记得 `nginx -t` 测试再 reload。几个常见坑:
- 规则加在了错误的 server 块(比如加到了默认站点,而不是你的域名对应的块)。
- 规则被别的 location 提前拦截,或者写成了 `try_files $uri /index.php`(丢了 query string,分页、搜索这类参数会失效)。
- 服务器上有多个站点同时监听 80/443,请求被另一个站点吃掉了。
Apache:.htaccess 要生效,AllowOverride 必须开
Apache 用户把下面的内容放进站点根目录的`.htaccess`:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
如果放了没反应,九成是主配置里目录段没允许重写覆盖,需要 `AllowOverride All`。另外确认 mod_rewrite 已启用、.htaccess 文件名前面那个点没被系统吃掉(Windows 上传常见)。
宝塔面板用户:伪静态别选错
面板用户最省事的做法是:站点设置→伪静态,选一个通用的转发规则(或直接用上面的 Nginx 片段粘贴进去),保存后重载。注意两类高发误操作:
1. 选了某个「框架专属」伪静态模板,里面带了额外重写规则,反而把`.html`请求拦走了。
2. 改了配置忘了保存或没 reload,看着改了实际没生效。
Clara BBS 没有 Composer 依赖、不需要命令行操作、也没有编译缓存,所以排查时不必往这些方向想,伪静态层就是唯一变量。
规则对了还是 404?再查这三处
- 站点地址填写不规范:后台「基本设置」里的站点地址建议带上 `https://` 和主域名,避免 www 域与裸域混用导致会话丢失、跳转错乱。这一项填错时,表现常常是登录态飘忽,顺带引发各种异常。
- CDN / 反向代理:CDN 只缓存了首页而没回源到正确路径,或回源 Host 配置不对,会出现「首页是旧的、帖子 404」。先临时回源直连 IP 验证。
- 规则语法本身有错:Nginx 配置写错会导致后续 location 不生效甚至整段被跳过,用 `nginx -t` 或在面板里看错误日志最快。
收尾
一句话记住这套顺序:先看 404 是哪一家的页面,服务器默认页就修伪静态,程序页面就查帖子状态与权限;伪静态只做一件事——把不存在的路径转发给 index.php,Nginx 用 `try_files $uri $uri/ /index.php?$query_string`,Apache 用三行 RewriteCond/RewriteRule;面板用户额外确认规则保存并重载、站点地址填写规范。按这个顺序走,首页能开、帖子 404 的情况基本几分钟内能定位。
转载请注明出处,版权归原作者所有。
星耀SVIP
管理员
黑卡会员





