帝国 CMS 设置不同栏目独立 URL 命名规则完整教程
时间:2026-08-12 09:46:50 来源:aliz.cn 作者:SKY 阅读:
前言
前面教程已经介绍纯 ID、日期格式、拼音标题、英文别名四类文件名方案。 但很多站长遇到痛点:所有栏目只能共用一套命名规则,灵活性不足。 以aliz.cn技术网站举例:
- 新闻资讯栏目:简短数字 ID,提升抓取速度
- 建站教程栏目:英文关键词别名 url,利于 SEO 关键词匹配
- 随笔日志栏目:汉字拼音 URL,增强地址可读性
帝国 CMS 原生后台无法分栏目配置命名模式,我们只需要改造
ReturnInfoFileName()底层生成函数,增加栏目 ID 条件判断,即可实现每个栏目独立的命名策略。
一、前期环境准备
- 已经建好需要用到的自定义字段
enalias(英文别名,VARCHAR 类型); - 已经在
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;
}
- 记下各个栏目的 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 步骤
修改完函数以后旧文章不会自动更新文件名,严格执行下面顺序:
- 网站文件、数据库进行备份;
- 教程栏目需要的文章填写英文别名字段;
- 后台【系统设置】→【数据更新中心】;
- 更新栏目缓存;
- 更新信息页地址(关键步骤,重新调用命名函数刷新数据库 filename 字段);
- 批量生成全部内容页静态页面。
六、子栏目继承父栏目 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 编写跳转规则,降低正则难度。
八、避坑指南
- 修改函数之后文件名没有变化 一定要执行「更新信息页地址」,帝国 CMS 会缓存文件名称至内容数据表;
- 部分模型数据表不存在 enalias 字段 下载、图集等其它模型,需要手动对应数据表添加
enalias自定义字段; - 别名出现特殊字符、空格 代码内置正则只允许小写字母、数字、短横线,非法字符会直接过滤;
- 生成文件名太长 使用 substr () 截断拼音字符串,控制长度在 50 字符以内;
- 修改文章标题之后拼音 URL 变动 拼音模式的页面标题改动就会刷新文件名;解决方案为拼音‑id 结构,id 固定不变。
九、aliz.cn站点的最优 URL 规划参考
- 资讯、快讯栏目:纯 ID,URL 最短,爬虫抓取效率最高;
- Nginx、PHP、帝国 CMS 教程栏目:自定义英文关键词别名,强化搜索引擎相关性;
- 技术随笔、日常分享栏目:标题拼音地址,兼顾可读性;
- 下载资源栏目:id‑name 结构,防止资源名称重复覆盖。
十、恢复系统默认状态
当你不需要栏目独立命名的时候,还原原生
ReturnInfoFileName函数源码,接着更新信息页地址即可恢复后台栏目配置的原生命名模式。
本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载
发表评论
共有0条评论