问题核心原因简述

DedeCMS为了实现更美观、更利于SEO的URL(将 article.php?id=123 变成 /article/123.html),使用了URL重写技术,这个过程需要服务器的支持,当你安装新模板时,模板文件中通常会包含或更新了.htaccess文件,这个文件里定义了重写规则,如果服务器没有正确启用或解析这些规则,访问这些“美化”后的链接时,服务器就找不到对应的页面,从而返回404错误。

dede模板安装后notfound
(图片来源网络,侵删)

解决方案(按优先级顺序排查)

第1步:检查并启用伪静态(URL重写)

这是90%的情况下导致404的原因,DedeCMS官方提供了多种服务器的伪静态规则,你需要根据你的服务器环境选择正确的规则并启用它。

找到并上传正确的.htaccess文件

  • 位置:在你的DedeCMS网站根目录下(即与index.php, dede文件夹同级的目录)。
  • 检查:检查这个目录下是否存在一个名为 .htaccess 的文件。
    • 如果不存在:你需要从DedeCMS的安装包里找到它,通常在 /data/ 目录下会有一个名为 htaccess.txt 的文件,将它重命名.htaccess,然后上传到网站根目录。
    • 如果已存在:用FTP工具或服务器的文件管理器打开它,检查里面的内容是否与你使用的服务器环境匹配。

根据服务器环境修改.htaccess

以下是针对不同服务器的标准伪静态规则,请用以下内容覆盖你根目录下的.htaccess文件。

dede模板安装后notfound
(图片来源网络,侵删)

A. Apache服务器(最常见)

如果你的网站使用的是虚拟主机或云服务器(如阿里云、腾讯云)的Linux系统,大概率是Apache服务器,请使用以下规则:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteRule ^index\.html$ /index.php [L]
  RewriteRule ^list-([0-9]+)\.html$ /plus/list.php?tid=$1 [L]
  RewriteRule ^list-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /plus/list.php?tid=$1&totalresult=$2&PageNo=$3 [L]
  RewriteRule ^view-([0-9]+)-([0-9]+)\.html$ /plus/view.php?arcID=$1&pageno=$2 [L]
  RewriteRule ^view-([0-9]+)\.html$ /plus/view.php?arcID=$1 [L]
  RewriteRule ^tag-(.*)\.html$ /plus/search.php?keyword=$1 [L]
</IfModule>

关键点:确保你的服务器开启了 mod_rewrite 模块,绝大多数虚拟主机都已开启,如果你有服务器管理权限,可以在 httpd.conf 配置文件中检查并取消 LoadModule rewrite_module modules/mod_rewrite.so 前面的 号。

B. Nginx服务器

dede模板安装后notfound
(图片来源网络,侵删)

如果你使用的是Nginx(常见于云服务器),你需要修改Nginx的配置文件(通常是 nginx.conf 或站点配置文件),在 server 块内添加以下规则:

location / {
    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php?s=$1 last;
        break;
    }
}

修改完配置文件后,务必重启Nginx服务,让配置生效。

C. IIS服务器(Windows系统)

如果你使用的是Windows系统的IIS服务器,你需要安装一个“ISAPI Rewrite”组件,然后根目录下的 httpd.ini 文件内容如下:

[ISAPI_Rewrite]
# 3600 = 1 hour
CacheClockRate 3600
RepeatLimit 32
RewriteRule ^(.*)/index\.html $1/index\.php [L]
RewriteRule ^(.*)/plus/list-([0-9]+)\.html $1/plus/list\.php\?tid=$2 [L]
RewriteRule ^(.*)/plus/list-([0-9]+)-([0-9]+)-([0-9]+)\.html $1/plus/list\.php\?tid=$2&TotalResult=$3&PageNo=$4 [L]
RewriteRule ^(.*)/plus/view-([0-9]+)-([0-9]+)\.html $1/plus/view\.php\?arcID=$2&pageno=$3 [L]
RewriteRule ^(.*)/plus/view-([0-9]+)\.html $1/plus/view\.php\?arcID=$2 [L]

第2步:检查DedeCMS后台设置

即使.htaccess文件正确,后台的开关也必须打开。

  1. 登录你的DedeCMS后台。
  2. 进入 “系统” -> “系统基本参数”
  3. 在左侧菜单找到 “核心设置”
  4. 找到以下两项,确保它们的值是 “是”
    • 是否使用伪静态
    • 是否为目录默认主页 (此项有助于SEO,但非必须)
  5. 保存设置。

第3步:检查文件权限

新上传的模板文件或.htaccess文件的权限不正确,导致服务器无法读取。

  • FTP工具设置:使用你的FTP软件(如FileZilla)连接服务器,进入网站根目录。
  • 设置权限:右键点击 .htaccess 文件,选择“文件权限”(或类似选项)。
  • 数值:将其权限设置为 644
  • 目录权限:确保 dededatauploadstemplets 等关键目录的权限设置为 755

第4步:检查模板文件本身(较少见)

如果以上方法都无效,可能是模板文件本身有问题。

  1. 检查index.php:用代码编辑器打开网站根目录的 index.php 文件,确保它没有被修改或损坏,默认内容应该是:
    <?php
    if(!file_exists(dirname(__FILE__).'/data/common.inc.php'))
    {
        header('Location:install/index.php');
        exit();
    }
    require_once (dirname(__FILE__) . "/include/common.inc.php");
    require_once DEDEINC."/arc.partview.class.php";
    $GLOBALS['_arclistEnv'] = 'index';
    $row = $dsql->GetOne("Select * From `dede_homepageset`");
    $row['templet'] = MfTemplet($row['templet']);
    $pv = new PartView();
    $pv->SetTemplet($cfg_basedir . $cfg_templets_dir . "/" . $row['templet']);
    $pv->Display();
    ?>
  2. 检查模板覆盖:如果你是用模板文件覆盖了旧模板,请确保没有覆盖掉核心的PHP文件(如上面提到的index.php),通常只覆盖/templets/目录下的文件和.htaccess

第5步:清除浏览器缓存和CDN缓存

你已经在本地解决了问题,但浏览器或CDN还缓存着旧的404页面。

  1. 浏览器:按 Ctrl + F5 强制刷新页面,或使用浏览器的“无痕/隐私模式”访问。
  2. CDN:如果你使用了阿里云、腾讯云、Cloudflare等CDN服务,请登录CDN控制台,找到你的域名,选择“刷新预热”,刷新URL和目录。

总结排查流程

遇到 "Not Found" 错误,请按以下顺序操作:

  1. 检查根目录的 .htaccess 文件是否存在,内容是否正确(根据服务器环境选择Apache/Nginx/IIS规则)。
  2. 登录DedeCMS后台,检查“系统基本参数” -> “核心设置” -> “是否使用伪静态”是否为“是”。
  3. 使用FTP工具,将 .htaccess 文件权限设置为 644,关键目录权限设置为 755
  4. 清除浏览器缓存(Ctrl+F5),如果用了CDN也一并刷新。
  5. 如果以上都无效,再检查模板文件是否损坏或错误地覆盖了核心文件。

按照这个流程,99%的404问题都能得到解决,如果问题依旧,请提供你的服务器环境(Apache/Nginx/IIS)和错误截图,以便进一步分析。