船说 CMSNginx 伪静态规则是什么
学会这篇,你能自己给船说 CMS 配好 Nginx 伪静态规则,把 /index.php/vod/play/id/12.html 这类地址变成干净的静态形式,并且知道出问题时该从哪一步查起。
第一步:先弄清伪静态在船说 CMS 里到底管什么
这一步要搞明白"规则写给谁看",做完你就知道后面每行配置的作用。
船说 CMS 基于 ThinkPHP 框架开发,它本身没有真静态页面,所有请求最终都由 index.php 处理。所谓伪静态,就是让 Nginx 先把好看的 URL(比如 /vod/play/id/12/sid/1/nid/1.html)接住,再转交给 index.php,由程序解析出参数。
所以动手前先判断两件事:
- 站点当前是哪种地址形式:带
/index.php的(PATH_INFO 模式),还是带?s=/的(兼容模式)。打开船说后台 → 系统 → 网站设置 → 找到"URL 模式"或"伪静态设置",看它给的是哪一种。 - Nginx 的站点配置文件在哪。宝塔面板:网站 → 找到你的站点 → 设置 → 配置文件;命令行环境一般在
/www/server/panel/vhost/nginx/你的域名.conf或/etc/nginx/conf.d/你的域名.conf。
注意:不同船说版本(影视版、小说版、二开版)后台菜单名不完全一样,找不到"URL 模式"就直接看首页链接长什么样,比翻菜单快。
第二步:写入伪静态规则
这一步得到的结果是——配置文件里出现一段 rewrite,Nginx 能把美化后的地址转给 PHP。
宝塔面板用户最省事:网站 → 设置 → 伪静态,在输入框里填下面这段。注意宝塔的伪静态框只填 location 段,不要填整个 server:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
如果你希望地址里不出现 ?s=,用 PATH_INFO 写法:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php/$1 last;
}
}
手工改配置文件的,完整 server 段大致如下,关键是 location / 和 PHP 处理这两段:
server {
listen 80;
server_name www.example.com;
root /www/wwwroot/www.example.com;
index index.php index.html;
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
注意:网上很多教程让你写
try_files $uri $uri/ /index.php?$query_string;。这条对 ThinkPHP 的 PATH_INFO 模式不生效,典型症状是"首页正常、内页全部 404",所以船说 CMS 优先用上面的 rewrite 写法。
注意:
if (!-e $request_filename)必须写在location /里面,直接放在 server 段会报错;也不要再写一条location / { try_files ... }跟它冲突。
第三步:检查语法并重载 Nginx
这一步确认配置没写错,并让它生效。
命令行执行:
nginx -t
看到 syntax is ok 和 test is successful 才算通过。然后重载:
systemctl reload nginx
宝塔面板里直接点"保存",它会自动测试并重载;如果弹出错误提示,就是语法写错了,按提示的行号回去改。
注意:改配置前先备份一份,比如
cp 你的域名.conf 你的域名.conf.bak,改错了好回滚。
第四步:验证伪静态是否真的生效
这一步判断规则有没有起作用。
浏览器打开一个内页地址(播放页或文章页),再用 curl 看返回码:
curl -I https://www.example.com/vod/play/id/12/sid/1/nid/1.html
返回 200 说明通了;返回 404 说明请求没被交给 index.php;返回 500 通常是 PHP 侧出错,去 站点目录/runtime/log/ 看当天日志。
第五步:出问题时的排查顺序
按下面顺序查,基本能定位到原因:
- 地址里
/index.php还在 → 后台 URL 模式没打开,或规则没保存成功。 - 首页正常、内页全 404 → rewrite 目标写错(
?s=和/混用),或 PHP 段缺fastcgi_split_path_info。 - 后台能进、前台 404 → 检查 root 是否应指向 public 子目录,部分船说版本入口在 public 下。
- 改了没反应 → 忘了重载 Nginx,或浏览器缓存,换无痕窗口再试。
小结
- 船说 CMS 的伪静态本质是把美化 URL 转交给 index.php,规则写在
location /里。 - 通用写法:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; };PATH_INFO 模式把?s=换成/。 - 宝塔面板只填 location 段;手工改配置要同时配好 PHP 的
fastcgi_split_path_info。 - 每次改完先
nginx -t,再systemctl reload nginx。 - 内页 404 先怀疑 rewrite 目标写法,500 先看
runtime/log日志。
原文链接:https://www.gj0.com/thread-784.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。