DEDECMS tags.php文件改名及TAG标签伪静态的方法
DEDECMS,默认的TAG标签链接方式是类似https://www.bnxb.com/tags.php?/win%E6%9C%8D%E5%8A%A1%E5%99%A8/ 这样的方式,通过根目录下的tags.php来调用,如果我们需要对tags.php文件改名呢,如何操作呢?其实很简单
第一步将根目录下的tags.php改成你需要的名称,比如改成biaoqian.php
第二步打开include/taglib/tag.lib.php文件找到$row['link'] =$cfg_cmsurl."/tags.php?/".urlencode($row['keyword'])."/";代码。将它替换成$row['link'] = "/biaoqian.php?/{$row['id']}.html";(注意符号都是英文,不是中文。不然查找不到,修改不成功)
接下来说一下tag标签伪静态的方法,至于为什么只要伪静态而不用我们另外一篇文章里面说的生成静态的方法:https://www.bnxb.com/dedecms/27133.html
主要是考虑到一般网站TAGS的数量会非常多,如果每个TAG都生成静态页,对服务器空间消耗会非常大,而且每次有TAG更新都要全部重新生成一遍,对服务器压力也很大,因此推荐用伪静态。
步骤如下:
1、TAG调用标签修改(下面两部任意选择一步)。
①改成用关键字.html的方式
打开include/taglib/tag.lib.php文件找到
$row['link'] =$cfg_cmsurl."/tags.php?/".urlencode($row['keyword'])."/";
代码。改成
$row['link'] = $cfg_cmsurl."/tags/".urlencode($row['keyword']).".html";
②改成用数值id.html的方式
注意这里将默认的TAG后面直接带关键字显示的方式,改成了用TAG的ID.html的方式了,这样可以防止出现类似win%E6%9C%8D%E5%8A%A1%E5%99%A8.html的情况
修改根目录下tags.php
找到
$tag = FilterSearch(urldecode($tag));
替换为:
$tag = urldecode($tag);
修改include/arc.taglist.class.php
找到
$this->TagInfos = $this->dsql->GetOne("Select * From `dede_tagindex` where taglike '{$this->Tag}' ");
替换为:
$this->TagInfos = $this->dsql->GetOne("Select * From `dede_tagindex` where id like'{$this->Tag}' ");
修改include/taglib/tag.lib.php
找到
$row['keyword'] = $row['tag'];
将$row['tag']更改为$row['id']
找到
$row['link'] = $cfg_cmsurl."/tags.php?/".$row['keyword']."/";
改为:
$row['link'] = $cfg_cmsurl."/tags/".urlencode($row['id']);
2、修改分页代码。
同样打开include/arc.taglist.class.php,主要是修改 获取动态的分页列表 和 获得一个指定的频道的链接之间的代码部分,也就是从429行 ---->537行之间
①先修改分页链接格式,分页让链接变成/tags/1这种模式,大概在457行,把:
$purl = $this->GetCurUrl(); $purl .= "?/".urlencode($this->Tag);
修改为:
$purl = $cfg_cmsurl; $purl .= "/tags/".urlencode($this->Tag);
②这里还有一个问题就是,首页的列表样式会生成一个/tags/keys/1.html这样的,很显然我们不需要的,这里也要做下修改,\include\arc.taglist.class.php文件,大概在507行,把:
else { $listdd.="<a href='".$purl."/$j.html'>".$j."</a>\r\n"; }
修改为:
else { if($j == 1) { $listdd.= "<a href='".$purl.".html'>".$j."</a>\r\n"; } else $listdd.="<a href='".$purl."/$j.html'>".$j."</a>\r\n"; }
加个判断,如果是第一页就直接生成/tags/keys.html这种地址格式,就不会生成1.html这样的后缀,实现地址格式seo化。
③做完前两步修改,我们会发现,tags首页和列表页实现了伪静态,但是列表页分页是/tags/关键词/2/这样的形式,而且会出现404错误,这里我们还要进一步做修改,实现像/tags/关键词/2.html这种样式。
1.修改\include\arc.taglist.class.php文件,大概在464行,把:
$prepage.="<li><a href='".$purl."/$prepagenum/'>上一页</a></li>\r\n"; $indexpage="<li><a href='".$purl."/1/'>首页</a></li>\r\n";
修改为(其实就是在链接后加了个后缀.html):
$prepage.="<a href='".$purl."/$prepagenum.html'>上一页</a>\r\n"; $indexpage="<a href='".$purl.".html'>首页</a>\r\n";
2.修改\include\arc.taglist.class.php文件,大概在473行,把:
$nextpage.="<li><a href='".$purl."/$nextpagenum/'>下一页</a></li>\r\n"; $endpage="<li><a href='".$purl."/$totalpage/'>末页</a></li>\r\n";修改为(其实就是在链接后加了个后缀.html):
$nextpage.="<a href='".$purl."/$nextpagenum.html'>下一页</a>\r\n"; $endpage="<a href='".$purl."/$totalpage.html'>末页</a>\r\n";
3.修改\include\arc.taglist.class.php文件,大概在509行,把:
$listdd.="<li><a href='".$purl."/$j/'>".$j."</a></li>\r\n";修改为(其实就是在链接后加了个后缀.html):
$listdd.="<a href='".$purl."/$j.html'>".$j."</a>\r\n";
3、修改模板
打开templets/default/taglist.htm(或者你自己的模板目录下),找到:
<strong>当前位置:</strong>:<a href="{dede:global.cfg_cmsurl/}/">主页</a> > <a href='tags.php'>TAG标签</a> > {dede:field.title /}
修改为
<strong>当前位置:</strong>:<a href="{dede:global.cfg_cmsurl/}/">主页</a> > <a href='/tags/'>TAG标签</a> > {dede:field.title /}
4、首页、列表页、内容页调用TAG标签带静态链接:
修改\include\helpers\archive.helper.php
前面已经把TAG标签访问地址静态化了,而dede默认调用的TAG标签是不带链接的,网上有带动态链接的方法,这里只需要修改一下。
如果需要带链接,请注释\include\helpers\archive.helper.php文件130行
// $tags .= ($tags=='' ? $row['tag'] : ','.$row['tag']);
用下面语句替换,当然你也可以加入自己的样式比如li之类的
$tags .= "<a href='/tags/".urlencode($row['tag']).".html'>".$row['tag']."</a>";
5、设置伪静态规则。新建一个txt文本,在文本里添加如下伪静态规则。然后另存为.htaccess上传到网站根目录即可(如果已有伪静态文件.htaccess,那么不要覆盖.htaccess。直接打开在里面添加如下规则保存即可。)
IIS6.0服务器伪静态规则:
RewriteRule ^(.*)/tags\.html $1/tags\.php RewriteRule ^(.*)/tags/(.*).html $1/tags\.php\?$2 RewriteRule ^(.*)/tags/(.*)\/([0-9]+)\.html $1/tags.php?/$2/$3/
IIS7.0及以上服务器伪静态规则:
<rule name="Redirecttagsl" stopProcessing="true"> <match url="^tags/(\w+)/([0-9]*).html" /> <action type="Rewrite" url="tags.php?/{R:1}/{R:2}"/> </rule> <rule name="Redirecttags1" stopProcessing="true"> <match url="^tags/(\w+).html" /> <action type="Rewrite" url="tags.php?/{R:1}"/> </rule> <rule name="Redirecttags" stopProcessing="true"> <match url="^tags.html" /> <action type="Rewrite" url="tags.php" /> </rule>
Apache服务器伪静态规则 :
RewriteRule ^tags.html /tags.php RewriteRule ^tags/(.*)(?:(\?.*))*\.html$ tags\.php\?\/$1 RewriteRule ^tags/(.*)\/(?:(\?.*))*\.html$ tags\.php\?\/$1\/ RewriteRule ^tags/(.*)\/([0-9])(?:(\?.*))*\.html$ tags\.php\?\/$1\/$2 RewriteRule ^tags/(.*)\/([0-9])\/(?:(\?.*))*\.html$ tags\.php\?\/$1\/$2\/
6、最后到dedecms后台更新一下,至此已完成所有的设置。可以看http://127.0.0.1/tags/1.html如下图的伪静态效果。
7、禁止搜索引擎再爬取tags.php
在根目录下robots.txt中添加
Disallow: /tags.php
以防止搜索引擎重复收录。
8、BUG修复
有可能你会出现以下错误!
系统无此标签,可能已经移除!
你还可以尝试通过搜索程序去搜索这个关键字:前往搜索>>
如果你的浏览器没反应,请点击这里...
解决办法如下:
在网站根目录下找到tags.php 此文件,将以下代码替换掉:
$tag = trim($_SERVER['QUERY_STRING']);
换成
$tag = strtolower(trim($_SERVER['QUERY_STRING']));
出现这个问题的原因是IIS伪静态中文转码为UTF8,解决方法就是在tags.php中加入判断UTF8编码的语句,如果是则转换为GBK,这样就可以解决了
方法:
1.把以下代码加入到根目录下tags.php中的18行下面,也就是if(isset($tags[2])) $PageNo = intval($tags[2]);下面哦:
function is_utf8($tag) { if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$tag) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$tag) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$tag) == true) { return true; } else { return false; } }
2.在第25行上面加入以下语句,也就是在$tag = FilterSearch(urldecode($tag));上面加入,记得这里是上面哦!
if(is_utf8($tag)==1) { $tag = iconv("utf-8","gbk",$tag); }
这个作用就是调用上面的函数判断编码 如果是 utf8则转为gbk;
到此,tags伪静态问题全面完美解决!
另外,nginx的伪静态规则至今搞不定,网上的都不可用,转换的也不行,有没有人知道的,可以留言一下
- 最新评论