船说 CMSNginx 伪静态规则是什么

域名注册
域名注册 正式会员超兽战士 👑年卡会员
发布于 2026-10-08 06:19 ·1 浏览 ·0 回复

学会这篇,你能自己给船说 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/ 看当天日志。

第五步:出问题时的排查顺序

按下面顺序查,基本能定位到原因:

  1. 地址里 /index.php 还在 → 后台 URL 模式没打开,或规则没保存成功。
  2. 首页正常、内页全 404 → rewrite 目标写错(?s= 和 / 混用),或 PHP 段缺 fastcgi_split_path_info。
  3. 后台能进、前台 404 → 检查 root 是否应指向 public 子目录,部分船说版本入口在 public 下。
  4. 改了没反应 → 忘了重载 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 日志。
版权声明:本文来自 GJ站长论坛《船说 CMSNginx 伪静态规则是什么》
原文链接:https://www.gj0.com/thread-784.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。

全部回复 0

还没有回复,来抢沙发~