有些勇于捯饬的小伙伴可能已经尝试过在PHPCMS的后台 - 扩展 - 自定义URL里设置过如下图类似 xinwen/guoji/12.html这样式的伪静态了,但是最后会惊喜的发现,基本上所有栏目和文章页都描边404,哇哈哈,容我开心一下。
其实PHPCMS在不生成静态页面的情况下,对于您在后台自定义的URL规则中的{$categorydir}和{$catdir}是不能正常解析的,就造成了您定义的伪静态地址都变成了404,如果希望实现和www.phpcmsx.com一样的目录式伪静态需要按以下步骤对PHPCMS程序进行调整和修改。
首先定个小目标:
我希望栏目页的动态地址
index.php?m=content&c=index&a=lists&catid=1
用下面这种形式的URL来访问
yourdomain.com/lanmudir/ (lanmudir是栏目的目录名,在后台设置栏目的时候填写的英文字母)
我希望内容页的动态地址
yourdomain.com/index.php?m=content&c=index&a=show&catid=1&id=5
用下面这种形式的URL来访问
yourdomain.com/lanmudir/5.html (lanmudir是栏目的目录名,在后台设置栏目的时候填写的英文字母)
那么首先我们就要让栏目和文章可以通过目录名正常访问到
也就是说URL要先变成下面这样(注意黄色字体是变化的地方)
yourdomain.com/index.php?m=content&c=index&a=lists&catdir=dir1
yourdomain.com/index.php?m=content&c=index&a=show&catdir=dir1&id=5
为了实现这个变化,我们赶紧上号!(JetBrains或vs或dw什么的)
phpcms\modules\content\classes\url.class.php
找到122行左右的
$url = str_replace(array('{$catid}', '{$page}'), array($catid, $page), $urlrule);
修改成
$category_dir = $this->get_categorydir($catid); $url = str_replace(array('{$catid}', '{$page}','{$catdir}','{$categorydir}'), array($catid, $page,$category['catdir'],$category_dir), $urlrule);
phpcms\modules\content\index.php (修改两处,增加两处)
找到207行左右的
$catid = $_GET['catid'] = intval($_GET['catid']);
修改成
if(isset ($_GET['catid'])){ $catid = $_GET['catid'] = intval($_GET['catid']); } else{ $catid=$this->_getCategoryId($_GET['catdir']); }
找到35行左右的
$catid = intval($_GET['catid']); $id = intval($_GET['id']);
修改成
if(isset ($_GET['catid'])){ $catid = intval($_GET['catid']); } else{ $catid=$this->_getCategoryId($_GET['catdir']); } if(isset($_GET['id'])){ $id = intval($_GET['id']); } else{ $id = $this->_getPrefixId($_GET['catdir'],$_GET['prefix']); }
找到本文件最下方最后一个 } 在其上面添加以下代码
private function _getCategoryId($catdir){ if(!strpos($catdir,'/')) { $dirname = $catdir; } else{ $dirname = end(explode('/',$catdir)); } $this->category_db = pc_base::load_model('category_model'); $result = $this->category_db->get_one(array('catdir'=>$dirname)); return $result['catid']; } private function _getPrefixId($catdir,$prefix){ if(!strpos($catdir,'/')) { $dirname = $catdir; } else{ $dirname = end(explode('/',$catdir)); } $this->category_db = pc_base::load_model('category_model'); $result = $this->category_db->get_one(array('catdir'=>$dirname)); $catid = $result['catid']; $siteids = getcache('category_content','commons'); $siteid = $siteids[$catid]; $CATEGORYS = getcache('category_content_'.$siteid,'commons'); if(!isset($CATEGORYS[$catid]) || $CATEGORYS[$catid]['type']!=0) showmessage(L('information_does_not_exist'),'blank'); $this->category = $CAT = $CATEGORYS[$catid]; $this->category_setting = $CAT['setting'] = string2array($this->category['setting']); $siteid = $GLOBALS['siteid'] = $CAT['siteid']; $MODEL = getcache('model','commons'); $modelid = $CAT['modelid']; $tablename = $this->db->table_name = $this->db->db_tablepre.$MODEL[$modelid]['tablename']; $result = $this->db->get_one(array('prefix'=>$prefix)); if(empty($result)){ $result = $this->db->get_one(array('id'=>$prefix)); } return $result['id']; }
然后,我们在PHPCMS的后台管理 - 扩展 - URL规则管理中添加两条新规则
第一条:
规则名称:填写category
模块名称: 选择‘内容模块’
是否生成静态: 选择‘否’
URL实例:填写 dir.html|dir-1.html
URL规则:填写
{$catdir}.html|{$catdir}-{$page}.html
第二条:
规则名称:填写show
模块名称: 选择‘内容模块’
是否生成静态: 选择‘否’
URL实例:填写 dir/1.html|dir/1-1.html
URL规则:填写
{$catdir}/{$id}.html|{$catdir}/{$id}-{$page}.html
然后更新全站缓存或栏目缓存,批量更新url (重要)
最后,还有最最最重要的一步: 见下页
- 前一篇: PHPCMS身份验证接口实例API开发实例
- 后一篇: PHPCMS中英双语网站的做法