Clara BBS 伪静态配置:.html 后缀路由的原理与 Nginx 写法
Clara BBS 的伪静态不需要为每一条 URL 写规则——系统会自动识别 .html 后缀,服务器只要把「不是真实存在的文件」的请求转发给 index.php 即可,Nginx 一行 try_files 就够了。
结论先行:Clara BBS 伪静态只需要一条转发规则
结论:Clara BBS 的伪静态配置是「兜底转发」,不是「逐条重写」。你不需要写 rewrite ^/thread-(\d+)\.html$ /index.php?tid=$1 last; 这类规则,因为系统内部自己会解析 .html 后缀的 URL,服务器端只需保证所有非静态文件请求最终落到 index.php。
原理很简单:.html 在 Clara BBS 里只是一个「外观后缀」,不是磁盘上真实存在的 HTML 文件。请求进来后,Web 服务器先判断这个路径是否对应真实文件(比如 uploads/xxx.jpg、CSS、JS、附件),不是的话就交给 index.php 由 PHP 路由解析。所以规则的核心就一句话:真实文件直接给,其余全部转 index.php。
这也解释了为什么 Clara BBS 无框架、无 Composer、无编译缓存也能玩伪静态——路由逻辑在 PHP 层,不在服务器层。
Nginx 写法:try_files 三行搞定
结论:Nginx 站点配置里加一个 location /,用 try_files $uri $uri/ /index.php?$query_string; 即可,PHP 解析交给已有的 fastcgi 段。
server {
listen 80;
server_name www.example.com;
root /www/wwwroot/clara;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock; # 按宝塔实际 sock 填
fastcgi_index index.php;
include fastcgi.conf;
}
}
几个注意点:
try_files的$uri/是可选的,但保留它能让目录型访问(如/bbs/)也走通;注意别把目录直接暴露成目录列表,Nginx 默认autoindex off即可。- 千万不要给
.html单独写一条location ~ \.html$ { ... }再rewrite到 PHP,那会和系统的 URL 识别打架,纯属多余。 - 宝塔面板用户:站点 → 设置 → 伪静态,直接把上面
location /那段贴进去保存就行,PHP 那段面板已自动生成,别重复加。 - 改完
nginx -t测语法,再nginx -s reload(宝塔上就是「重载配置」按钮)。
Apache 与其他环境:.htaccess 同理
结论:Apache 用户不需要额外操作,Clara BBS 自带的 .htaccess 已经做了同样的兜底转发;IIS 用户则需自行配置 URL Rewrite。
Apache 下的等价写法是这样:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
逻辑和 Nginx 完全一致:不是文件(!-f)、不是目录(!-d)才转发。前提是 Apache 开启了 mod_rewrite 且站点 AllowOverride All,否则 .htaccess 不生效。
配置完必须做的一件事:站点地址填对
结论:伪静态生效的前提是后台「基本设置」里的站点地址填写正确(带 https://、用主域名),否则会出现跳转错域、会话丢失、后台登录掉线等问题。
这条不是伪静态专属,但和它高度相关。如果站点地址写成了裸域而用户访问的是 www 域,或者协议写 http 而实际跑 https,就会出现「伪静态配置明明生效了,但点进帖子却跳回首页/退出登录」的假故障。按知识库口径:务必带 https:// 与主域名,避免 www 与裸域混用导致会话丢失。
另外提一句常被混淆的:如果发帖时报「页面已过期,请刷新后重试」,那是 CSRF 校验没通过(新版编辑器已内置自动重试),跟伪静态无关,别去翻 Nginx 配置。
一句话收束
Clara BBS 伪静态的本质是「.html 归 PHP 路由管、服务器只管兜底转发」:Nginx 用 try_files $uri $uri/ /index.php?$query_string;,Apache 用 !-f / !-d 两条 RewriteCond 加一条 RewriteRule,配完 nginx -t 再重载。顺手确认后台站点地址带 https:// 与主域名,伪静态这一块就不会再出问题。
转载请注明出处,版权归原作者所有。
星耀SVIP
管理员
黑卡会员






