核心思路
织梦的默认搜索URL是动态的,/search.php?keyword=关键词&channeltype=1。
我们的目标是将其修改为更静态的形式,/search/关键词-channeltype-1.html。

这个过程分为两步:
- 修改模板文件:让织梦在生成搜索链接时,使用我们自定义的静态URL格式。
- 配置服务器伪静态规则:当用户访问我们生成的静态URL时,服务器能将其“翻译”回织梦能识别的动态URL,并正确执行搜索。
第一步:修改织梦模板文件
这是最关键的一步,目的是改变搜索链接的生成方式。
修改搜索表单页面 (通常是 search.htm)
这个文件位于你的织梦模板目录下,路径类似 /templets/default/search.htm。
你需要找到搜索表单的 <form> 标签,将其 action 属性从默认的动态URL改为新的伪静态URL。

原始代码 (大约在第16行左右):
<form name="formsearch" action="{dede:global.cfg_cmspath/}/search.php" >
修改后的代码:
<form name="formsearch" action="{dede:global.cfg_cmspath/}/search" > <!-- 注意这里去掉了 .php -->
这样,当用户在搜索框中输入关键词并点击搜索时,表单会提交到 /search 这个地址。
修改搜索结果页模板 (通常是 search_result.htm)
这个文件同样位于模板目录下,我们需要修改分页导航的链接,使其也符合新的伪静态格式。

织梦的分页标签是 {dede:pagelist listitem="pre,next,end,option" listsize="5" /},这个标签本身不支持直接修改URL格式,我们需要通过修改织梦的核心文件来实现,但更简单的方法是直接在模板里用自定义的循环来生成。
原始分页代码:
{dede:pagelist listitem="pre,next,end,option" listsize="5" /}
替换为自定义分页代码 (更灵活可控):
在 search_result.htm 中找到分页部分,用以下代码替换,这段代码会遍历分页数据,并按照我们想要的格式生成链接。
<!-- 分页开始 -->
<div class="page">
{dede:pagelist listitem="pre,next,end,option" listsize="5" runphp='yes'}
$attr = array();
preg_match('/listitem="(.+?)"/', $this->ctag, $matches);
$listitems = explode(',', $matches[1]);
$revalue = '';
foreach ($listitems as $li) {
$li = trim($li);
if ($li == 'pre') {
$prepage = str_replace('.php', '', $this->GetPrePage());
$revalue .= "<a href='".$prepage."'>上一页</a> ";
} else if ($li == 'next') {
$nextpage = str_replace('.php', '', $this->GetNextPage());
$revalue .= "<a href='".$nextpage."'>下一页</a> ";
} else if ($li == 'end') {
$endpage = str_replace('.php', '', $this->GetEndPage());
$revalue .= "<a href='".$endpage."'>末页</a> ";
} else if ($li == 'option') {
$rule = '/search-{page}.html'; // 定义伪静态规则
$revalue .= "<select name='gotopage' onchange='location.href=this.options[this.selectedIndex].value;'>";
for($i=1;$i<=$this->TotalResult; $i++) {
$page = $i;
$url = str_replace('{page}', $page, $rule);
if($this->NowPage == $page) {
$revalue .= "<option value='".$url."' selected>".$page."</option>";
} else {
$revalue .= "<option value='".$url."'>".$page."</option>";
}
}
$revalue .= "</select>";
}
}
echo $revalue;
{/dede:pagelist}
</div>
<!-- 分页结束 -->
代码解释:
runphp='yes':允许在标签内执行PHP代码。$rule = '/search-{page}.html';:这里定义了分页页面的伪静态规则,你可以根据需要修改,/search/关键词-{page}.html。str_replace('.php', '', $this->GetPrePage()):这是核心,它获取原始的分页URL(如/search.php?keyword=xxx&pageno=2),然后去掉.php部分,得到/search?keyword=xxx&pageno=2,服务器规则会处理这个URL。
第二步:配置服务器伪静态规则
现在我们已经让织梦生成了类似 /search/关键词-channeltype-1.html 的链接,但服务器还不认识它,我们需要告诉服务器如何处理这种请求。
重要提示:在修改服务器配置前,请务必备份你的配置文件!
Apache 服务器
织梦官方已经为我们准备好了Apache的伪静态规则文件,名为 httpd.ini.txt。
-
操作步骤:
- 通过FTP或文件管理器,进入你的网站根目录。
- 找到
httpd.ini.txt文件。 - 将其重命名为
httpd.ini。 - 将这个
httpd.ini文件上传到你的网站根目录。
httpd.ini文件内容通常包含以下规则(这是织梦5.7及以后版本的通用规则):[ISAPI_Rewrite] # 3600 = 1 hour CacheClockRate 3600 RepeatLimit 32 # 独立主机用户可修改 RewriteBase 为 /你的网站目录/ # 虚拟主机用户请使用 RewriteBase / RewriteBase / RewriteRule ^search$ /search\.php [NC,L] RewriteRule ^search/(.*)$ /search\.php\?$1 [NC,L] RewriteRule ^search/list-(.+?)-(.+?).html$ /search\.php?keyword=$1&channeltype=$2 [NC,L] RewriteRule ^search/list-(.+?)-(.+?)-(.+?).html$ /search\.php?keyword=$1&channeltype=$2&pagesize=$3 [NC,L]
RewriteRule ^search$ /search\.php [NC,L]:将/search重写为/search.php。RewriteRule ^search/(.*)$ /search\.php\?$1 [NC,L]:将/search/任意参数重写为/search.php?任意参数,这是最通用的一条规则。- 后面几条是针对更复杂URL格式的规则,如果上面的通用规则能解决问题,这几条可以保留也可以注释掉。
Nginx 服务器
对于Nginx,你需要修改网站配置文件(通常在 /etc/nginx/sites-available/ 目录下,或者宝塔面板里的“网站设置”->“伪静态”)。
将以下规则添加到你的Nginx server 配置块中:
# 将 /search 重写为 /search.php rewrite "^/search$" /search.php last; # 将 /search/任意参数 重写为 /search.php?任意参数 rewrite "^/search/(.*)$" /search.php?$1 last; # 可选:针对特定格式的URL rewrite "^/search/list-(.+?)-(.+?).html$" /search.php?keyword=$1&channeltype=$2 last; rewrite "^/search/list-(.+?)-(.+?)-(.+?).html$" /search.php?keyword=$1&channeltype=$2&pagesize=$3 last;
宝塔面板用户操作:
- 进入“网站”列表,点击你的站点。
- 点击“设置” -> “伪静态”。
- 将上面的Nginx规则粘贴进去,然后点击“保存”。
IIS 服务器
IIS需要使用 web.config 文件。
- 在网站根目录创建一个
web.config文件。 - 粘贴进去:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="DedeSearch Rewrite" stopProcessing="true">
<match url="^search$" />
<action type="Rewrite" url="search.php" />
</rule>
<rule name="DedeSearch Rewrite with Params" stopProcessing="true">
<match url="^search/(.*)$" />
<action type="Rewrite" url="search.php?{R:1}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
第三步:清除缓存并测试
完成以上所有步骤后,你需要:
-
清除织梦缓存:
- 登录织梦后台。
- 进入“系统” -> “清除缓存” -> “一键更新所有缓存”。
- 或者直接删除
/data目录下的cache文件夹里的内容。
-
测试:
- 前台访问你的搜索页面 (
/search)。 - 输入一个关键词进行搜索,检查URL是否变成了你想要的伪静态格式(如
/search/关键词.html)。 - 检查搜索结果是否正确显示。
- 点击分页链接,检查分页URL是否也正确,并且能正常跳转。
- 前台访问你的搜索页面 (
常见问题与注意事项
- 404错误:如果访问伪静态URL后出现404错误,几乎可以肯定是服务器伪静态规则没有生效,请检查规则文件是否上传到了正确位置(网站根目录),文件名是否正确,并确保服务器模块(如Apache的
mod_rewrite)已启用。 - 搜索结果为空:如果URL格式对了,但搜索结果不正确或为空,通常是第一步的模板修改有误,或者分页代码中的规则与服务器规则不匹配,请仔细核对代码。
- 特殊字符:如果搜索关键词包含空格或特殊符号,URL可能会变得很长或混乱,可以考虑在生成URL时对关键词进行
urlencode处理,但这会增加复杂性,对于大多数情况,当前方案已经足够。 - 不同织梦版本:虽然本教程适用于大多数DedeCMS 5.x版本,但极少数旧版本可能存在细微差异,如果遇到问题,可以查阅对应版本的官方文档或社区。
通过以上步骤,你就可以成功地将织梦DedeCMS的搜索功能改为URL伪静态,让你的网站在搜索引擎眼中更加“漂亮”了。
