论坛伪静态怎么配置?Nginx 与 Apache 两种写法
Clara BBS 伪静态无需逐版块写规则,只需将非真实文件或目录的请求统一交给 index.php,Nginx 用 try_files $uri $uri/ /index.php?$query_string,Apache 用 .htacc
结论:Clara BBS 配伪静态根本不用为每个版块、每个帖子写一堆 RewriteRule——它自动识别 .html 后缀的 URL,服务器端只需要把「不存在的文件或目录」请求统一兜底交给 index.php 就行,Nginx 用一行 try_files,Apache 用一个 .htaccess,改完立即生效。
为什么这个系统"无需额外规则"
Clara BBS 是单入口架构,URL 长什么样、.html 后缀怎么解析,全部在 PHP 内部完成,服务器不参与路由判断。这意味着两件事:一是规则极少,写一次全局兜底就永久有效;二是以后新增版块、新增子分类都不用回头改配置,不会出现"新开的版块打不开"这种典型传统论坛的坑。
所以配置思路只有一句话:**真实存在的文件(图片、CSS、JS、附件、uploads 目录)照常直接返回,其余请求统统交给 index.php。** try_files 的匹配顺序天然满足这一点,这也是它比一堆 location ~ \.html$ 更稳的原因。
Nginx 写法
在站点配置的 server { } 里,给根路径加一行 try_files 即可,其余保持面板生成的原样。
server {
listen 80;
server_name bbs.example.com;
root /www/wwwroot/bbs;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# 下面的 PHP 段保留宝塔/面板自动生成的即可,不要手改 socket 名
location ~ \.php$ {
fastcgi_pass unix:/tmp/php-cgi-74.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
注意点有三个。第一,?$query_string 不能省,搜索、分页、筛选这类带参数的 URL 靠它透传,省掉会出现翻页只回首页。第二,location ~ \.php$ 这一段宝塔面板本来就会生成,fastcgi_pass 的 socket 名字跟 PHP 版本绑定,手改容易 502,只动 location / 最安全。第三,改完执行一次 nginx -t 再 reload,别直接重启,配置写错会导致整个站挂掉。
Apache 写法
Apache 走 .htaccess。确认 mod_rewrite 已启用、站点目录的 AllowOverride 为 All(宝塔里是"网站→设置→伪静态"之外的目录权限项,VPS 手装则在 httpd.conf 里改),然后把下面这段放到站点根目录:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L,QSA]
</IfModule>
两个条件行的含义就是"请求的不是真实文件、也不是真实目录"才转发,所以 uploads 里的图片不会被吞掉。如果论坛装在二级目录(比如 /bbs),把 RewriteBase / 改成 RewriteBase /bbs/,否则会转发到站外路径去。
配完怎么验证、以及几个常见坑
验证方法很直接:随便打开一个帖子或版块的 .html 链接,能正常显示就说明转发通了;返回 404 基本就是规则没生效(Nginx 忘 reload、Apache 的 AllowOverride 没开)或者根目录 root 指错了位置。
几个最容易踩的点。一是后台「基本设置」里的站点地址必须填对,带上 https:// 和主域名,www 与裸域混用会导致会话丢失,这时候表现出来的症状很像伪静态坏了,其实是 Cookie 域不对。二是图片、样式全丢,通常是规则写成了无条件转发,检查一下 try_files 或 RewriteCond 的"真实文件优先"有没有被删掉。三是发帖提示"页面已过期,请刷新后重试",这跟伪静态无关,那是 CSRF 校验没过,刷新页面即可,新版编辑器还内置了自动重试。
收一下:Clara BBS 的伪静态成本极低——Nginx 一行 try_files $uri $uri/ /index.php?$query_string,Apache 一段带 !-f !-d 条件的 RewriteRule,全局生效、无需随版块增减维护。真正要盯的只有站点地址写没写对、PHP 段有没有误改、改完有没有 reload 这三件事。
转载请注明出处,版权归原作者所有。
星耀SVIP
管理员
黑卡会员






