欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国 CMS 设置不同栏目独立 URL 命名规则完整教程

时间:2026-08-12 09:46:50  来源:aliz.cn  作者:SKY  阅读:

前言


前面教程已经介绍纯 ID、日期格式、拼音标题、英文别名四类文件名方案。 但很多站长遇到痛点:所有栏目只能共用一套命名规则,灵活性不足。 以aliz.cn技术网站举例:
  1. 新闻资讯栏目:简短数字 ID,提升抓取速度
  2. 建站教程栏目:英文关键词别名 url,利于 SEO 关键词匹配
  3. 随笔日志栏目:汉字拼音 URL,增强地址可读性

帝国 CMS 原生后台无法分栏目配置命名模式,我们只需要改造ReturnInfoFileName()底层生成函数,增加栏目 ID 条件判断,即可实现每个栏目独立的命名策略。

一、前期环境准备

  1. 已经建好需要用到的自定义字段enalias(英文别名,VARCHAR 类型);
  2. 已经在e/class/functions.php底部部署汉字转拼音函数strtopinyin

php
运行
function strtopinyin($str){
    $str = preg_replace('/[^\x{4e00}-\x{9fa5}a-zA-Z0-9]/u','-',$str);
    $str = preg_replace('/-+/','-',$str);
    $str = trim($str,'-');
    $str = strtolower($str);
    return $str;
}
  1. 记下各个栏目的 classid,后台栏目管理即可查看栏目 ID; 示例定义:
  • classid=1 首页
  • classid=2 资讯栏目(纯‑id.html)
  • classid=3 建站教程栏目(英文别名‑id.html)
  • classid=4 日常随笔栏目(拼音‑id.html)

二、改写 ReturnInfoFileName 栏目判断函数


打开 e/class/functions.php,找到并且替换ReturnInfoFileName完整代码:
php
运行
function ReturnInfoFileName($filename,$classid,$id,$title){
    global $empire,$dbtbpre;
    //获取当前栏目数据表名称
    $cr=$empire->fetch1("select tbname from {$dbtbpre}enewsclass where classid='$classid'");
    $table = $dbtbpre.'ecms_'.$cr['tbname'];
    //读取文章自定义英文别名
    $info = $empire->fetch1("select enalias from {$table} where id='$id'");

    //规则1:资讯栏目 classid=2 采用纯ID命名
    if($classid == 2)
    {
        return $id.".html";
    }
    //规则2:教程栏目 classid=3 优先英文别名,别名空则降级拼音+id
    elseif($classid == 3)
    {
        if(!empty($info['enalias']))
        {
            $name = strtolower($info['enalias']);
            $name = preg_replace('/[^a-z0-9\-]/','',$name);
            $name = preg_replace('/-+/','-',$name);
            $name = trim($name,'-');
            return $name.'-'.$id.".html";
        }
        else
        {
            $name = strtopinyin($title);
            $name = substr($name,0,50);
            return $name.'-'.$id.".html";
        }
    }
    //规则3:随笔栏目 classid=4 使用拼音+id
    elseif($classid == 4)
    {
        $name = strtopinyin($title);
        $name = substr($name,0,50);
        return $name.'-'.$id.".html";
    }
    //兜底默认规则,其余栏目沿用系统原生设置
    else
    {
        return GetInfoFileName($filename,$id);
    }
}

保存 functions‑php 文件,至此多栏目独立 URL 规则部署完毕。

三、分组栏目 ID 批量管理方案


栏目数量很多的时候,可以使用数组归类,方便后续增删栏目,代码可读性更强:
php
运行
function ReturnInfoFileName($filename,$classid,$id,$title){
    global $empire,$dbtbpre;
    $cr=$empire->fetch1("select tbname from {$dbtbpre}enewsclass where classid='$classid'");
    $table = $dbtbpre.'ecms_'.$cr['tbname'];
    $info = $empire->fetch1("select enalias from {$table} where id='$id'");

    //栏目分组
    $id_arr['news'] = [2,6,8];//资讯类栏目id数组
    $id_arr['tutorial'] = [3,7];//教程栏目
    $id_arr['note'] = [4,9];//随笔日志栏目

    if(in_array($classid,$id_arr['news'])){
        return $id.".html";
    }elseif(in_array($classid,$id_arr['tutorial'])){
        if(!empty($info['enalias']))
        {
            $name = strtolower($info['enalias']);
            $name = preg_replace('/[^a-z0-9\-]/','',$name);
            $name = preg_replace('/-+/','-',$name);
            $name = trim($name,'-');
            return $name.'-'.$id.".html";
        }
        $name = strtopinyin($title);
        $name = substr($name,0,50);
        return $name.'-'.$id.".html";
    }elseif(in_array($classid,$id_arr['note'])){
        $name = strtopinyin($title);
        $name = substr($name,0,50);
        return $name.'-'.$id.".html";
    }else{
        return GetInfoFileName($filename,$id);
    }
}

后期新增栏目,直接往对应数组内填入栏目 ID 即可,无需改动大量 if 判断。

四、适配 Nginx 伪静态(兼容数字、拼音、英文别名文件名)


因为现在网站同时存在多种格式 html 文件名,正则需要匹配数字、小写字母和短横线。 站点 Nginx 伪静态配置:
nginx
location ~ ^/([a-z0-9]+)/([a-z0-9\-]+)\.html$ {
    try_files $uri /e/action/ShowInfo.php?classid=$1&alias=$2;
}
静态模式只是生成对应的 html 文件,伪静态参数不会生效;该配置仅适合动态访问模式。

五、刷新全部存量文章 URL 步骤


修改完函数以后旧文章不会自动更新文件名,严格执行下面顺序:
  1. 网站文件、数据库进行备份;
  2. 教程栏目需要的文章填写英文别名字段;
  3. 后台【系统设置】→【数据更新中心】;
  4. 更新栏目缓存;
  5. 更新信息页地址(关键步骤,重新调用命名函数刷新数据库 filename 字段);
  6. 批量生成全部内容页静态页面。

六、子栏目继承父栏目 URL 规则


很多站长需要子栏目跟随上级栏目使用同一套命名方式,这里提供获取父级栏目 ID 的代码示例:
php
运行
//读取当前栏目的上级ID
$cr=$empire->fetch1("select bclassid from {$dbtbpre}enewsclass where classid='$classid'");
$parentid = $cr['bclassid'];

之后判断$parentid,根据父栏目 ID 分配 URL 策略,实现全部子栏目继承父栏目规则。

七、URL 改版之后 301 跳转处理


改版之后旧链接失效,按照不同旧文件名编写 Nginx 重定向规则:
nginx
#旧时间戳‑id.html跳转
rewrite ^(.*)/[\d]+-(\d+)\.html$ $1/$2.html permanent;

如果多套 URL 混杂,建议优先别名带上文章 ID,依靠固定 id 编写跳转规则,降低正则难度。

八、避坑指南

  1. 修改函数之后文件名没有变化 一定要执行「更新信息页地址」,帝国 CMS 会缓存文件名称至内容数据表;
  2. 部分模型数据表不存在 enalias 字段 下载、图集等其它模型,需要手动对应数据表添加enalias自定义字段;
  3. 别名出现特殊字符、空格 代码内置正则只允许小写字母、数字、短横线,非法字符会直接过滤;
  4. 生成文件名太长 使用 substr () 截断拼音字符串,控制长度在 50 字符以内;
  5. 修改文章标题之后拼音 URL 变动 拼音模式的页面标题改动就会刷新文件名;解决方案为拼音‑id 结构,id 固定不变。

九、aliz.cn站点的最优 URL 规划参考

  1. 资讯、快讯栏目:纯 ID,URL 最短,爬虫抓取效率最高;
  2. Nginx、PHP、帝国 CMS 教程栏目:自定义英文关键词别名,强化搜索引擎相关性;
  3. 技术随笔、日常分享栏目:标题拼音地址,兼顾可读性;
  4. 下载资源栏目:id‑name 结构,防止资源名称重复覆盖。

十、恢复系统默认状态


当你不需要栏目独立命名的时候,还原原生ReturnInfoFileName函数源码,接着更新信息页地址即可恢复后台栏目配置的原生命名模式。

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程