| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 | 
							- <?php
 
- /**
 
-  * @copyright (C)2016-2099 Hnaoyun Inc.
 
-  * @author XingMeng
 
-  * @email hnxsh@foxmail.com
 
-  * @date 2018年2月14日
 
-  *  首页控制器
 
-  */
 
- namespace app\home\controller;
 
- use core\basic\Controller;
 
- use app\home\model\ParserModel;
 
- use core\basic\Config;
 
- use core\basic\Url;
 
- class IndexController extends Controller
 
- {
 
-     protected $parser;
 
-     protected $model;
 
-     protected $htmldir;
 
-     public function __construct()
 
-     {
 
-         $this->parser = new ParserController();
 
-         $this->model = new ParserModel();
 
-         $this->htmldir = $this->config('tpl_html_dir') ? $this->config('tpl_html_dir') . '/' : '';
 
-     }
 
-     // 空拦截器, 实现文章路由转发
 
-     public function _empty()
 
-     {
 
-         // 地址类型
 
-         $url_rule_type = $this->config('url_rule_type') ?: 3;
 
-         if (P) { // 采用pathinfo模式及p参数伪静态模式
 
-             if ($url_rule_type == 2) { // 禁止伪静态时带index.php 和动态地址访问
 
-                 if(stripos(URL, 'index.php') !== false){
 
-                     _404('您访问的内容不存在,请核对后重试!');
 
-                 }
 
-                 if(stripos(URL,'?') !== false && stripos(URL,'/?tag=') == false && stripos(URL,'/?page=') == false && stripos(URL,'/?ext_') == false){
 
-                     _404('您访问的内容不存在,请核对后重试!');
 
-                 }
 
-             }
 
-             $path = P;
 
-         } elseif ($url_rule_type == 3 && isset($_SERVER["QUERY_STRING"]) && $qs = $_SERVER["QUERY_STRING"]) { // 采用简短传参模式
 
-             parse_str($qs, $output);
 
-             unset($output['page']); // 去除分页
 
-             if ($output && ! current($output)) { // 第一个路径参数不能有值,否则非标准路径参数
 
-                 $path = key($output); // 第一个参数为路径信息,注意PHP数组会自动将key点符号转换下划线
 
-             } elseif (get('tag')) { // 对于兼容模式tag需要自动跳转tag独立页面
 
-                 $tag = new TagController();
 
-                 $tag->index();
 
-             } elseif (get('keyword')) { // 兼容模式搜索处理
 
-                 $search = new SearchController();
 
-                 $search->index();
 
-             }
 
-         }
 
-         
 
-         // 判断是否存在后缀
 
-         $url_rule_suffix = substr($this->config('url_rule_suffix'), 1);
 
-         $suffix = false;
 
-         $slash = false;
 
-         if (preg_match('/(.*)(_|\.)' . $url_rule_suffix . '$/', $path, $matchs)) {
 
-             $path = $matchs[1];
 
-             $suffix = true;
 
-         } elseif (preg_match('/^[\w\-\/]+\/$/', $path)) {
 
-             $slash = true;
 
-             $path = trim($path, '/');
 
-         }
 
-         $path = escape_string($path);
 
-         $path_arr = $path ? explode('/', $path) : array();
 
-         
 
-         // 开始路由
 
-         if (isset($path_arr) && count($path_arr) > 0 && preg_match('/^[\w\-\/]+$/', $path)) {
 
-             switch (strtolower($path_arr[0])) {
 
-                 case 'search':
 
-                 case 'keyword':
 
-                     $search = new SearchController();
 
-                     $search->index();
 
-                     break;
 
-                 case 'message':
 
-                     $msg = new MessageController();
 
-                     $msg->index();
 
-                     break;
 
-                 case 'form':
 
-                     $_GET['fcode'] = $path_arr[1];
 
-                     $form = new FormController();
 
-                     $form->index();
 
-                     break;
 
-                 case 'sitemap':
 
-                 case 'sitemap_xml':
 
-                     $sitemap = new SitemapController();
 
-                     $sitemap->index();
 
-                     break;
 
-                 case 'sitemap_txt':
 
-                     $sitemap = new SitemapController();
 
-                     $sitemap->linkTxt();
 
-                     break;
 
-                 case 'tag':
 
-                     $tag = new TagController();
 
-                     $tag->index();
 
-                     break;
 
-                 case 'member':
 
-                     $member = new MemberController();
 
-                     $member->{$path_arr[1]}();
 
-                     break;
 
-                 case 'comment':
 
-                     $comment = new CommentController();
 
-                     $comment->{$path_arr[1]}();
 
-                     break;
 
-                 case 'spider':
 
-                     $spider = new SpiderController();
 
-                     $spider->index();
 
-                     break;
 
-                 default:
 
-                     
 
-                     $url_break_char = $this->config('url_break_char') ?: '_';
 
-                     $url_rule_content_path = $this->config('url_rule_content_path') ? true : false;
 
-                     $err = '';
 
-                     $iscontent = false;
 
-                     
 
-                     // 开始进行地址匹配
 
-                     if (! $suffix && ! ! $sort = $this->model->getSort($path)) {
 
-                         // 栏目名称,即栏目全路径匹配
 
-                     } elseif (preg_match('/^([a-zA-Z0-9\-\/]+)' . $url_break_char . '([0-9]+)$/i', $path, $matchs) && ! ! $sort = $this->model->getSort($matchs[1])) {
 
-                         // 栏目名称_分页,栏目分页的情况
 
-                         define('CMS_PAGE_CUSTOM', true); // 设置走自定义CMS分页
 
-                         $_GET['page'] = $matchs[2]; // 设置分页参数
 
-                     } else {
 
-                         
 
-                         if ($url_rule_content_path && ! ! $data = $this->model->getContent($path)) {
 
-                             $iscontent = true; // 短路径情况
 
-                         } elseif (! $url_rule_content_path) {
 
-                             // 详情页至少是2级,对地址进行栏目和内容路径拆分,访问详情页
 
-                             $part1 = dirname($path);
 
-                             $part2 = basename($path);
 
-                             while ($part1 != '.') {
 
-                                 if ((! ! $sort = $this->model->getSort($part1)) && ! ! $data = $this->model->getContent($part2)) {
 
-                                     // 栏目名称/内容名称或ID
 
-                                     $iscontent = true;
 
-                                     $scode = $sort->scode;
 
-                                     break;
 
-                                 } elseif (preg_match('/^([a-zA-Z0-9\-\/]+)' . $url_break_char . '([0-9]+)$/i', $part1, $matchs) && ! ! $model = $this->model->checkModelUrlname($matchs[1])) {
 
-                                     // 模型名称_栏目ID/内容名称或ID
 
-                                     $data = $this->model->getContent($part2);
 
-                                     $iscontent = true;
 
-                                     $scode = $matchs[2];
 
-                                     // 限制串模型多路径
 
-                                     if (! ! $data->urlname && $matchs[1] != $data->urlname) {
 
-                                         $err = true;
 
-                                     }
 
-                                     break;
 
-                                 } else {
 
-                                     $part2 = basename($part1) . '/' . $part2;
 
-                                     $part1 = dirname($part1);
 
-                                 }
 
-                             }
 
-                             
 
-                             // 限制串栏目多路径
 
-                             if ($scode != $data->scode) {
 
-                                 $err = true;
 
-                             }
 
-                             
 
-                             // 限制串内容ID及名称多路径
 
-                             if (! ! $data->filename && $part2 != $data->filename) {
 
-                                 $err = true;
 
-                             }
 
-                         }
 
-                         
 
-                         // 执行未配置栏目名称但是配置了模型路径的情况路径匹配
 
-                         if (! $iscontent) {
 
-                             preg_match('/^([a-zA-Z0-9\-\/]+)(' . $url_break_char . '([0-9]+))?' . $url_break_char . '([0-9]+)$/i', $path, $matchs);
 
-                             if ($matchs[2] && $model = $this->model->checkModelUrlname($matchs[1])) {
 
-                                 // 模型名称_栏目ID_分页
 
-                                 define('CMS_PAGE_CUSTOM', false);
 
-                                 $sort = $this->model->getSort($matchs[3]);
 
-                                 $_GET['page'] = $matchs[4]; // 分页
 
-                             } elseif (! ! $model = $this->model->checkModelUrlname($matchs[1])) {
 
-                                 // 模型名称_栏目ID
 
-                                 $sort = $this->model->getSort($matchs[4]);
 
-                             }
 
-                             
 
-                             // 限制串模型和栏目名称多路径,当栏目名称不为空时不允许使用模型路径
 
-                             if ($sort->filename != '') {
 
-                                 $err = true;
 
-                             }
 
-                             
 
-                             // 限制串模型多路径
 
-                             if (! ! $sort->urlname && $matchs[1] != $sort->urlname) {
 
-                                 $err = true;
 
-                             }
 
-                         }
 
-                     }
 
-                     
 
-                     if ($iscontent) {
 
-                         define('CMS_PAGE', false); // 使用普通分页处理模型
 
-                         if (! ! $data && $suffix && ! $err) {
 
-                             $this->getContentPage($data);
 
-                         } else {
 
-                             _404('您访问的内容不存在,请核对后重试!');
 
-                         }
 
-                     } else {
 
-                         define('CMS_PAGE', true); // 使用cms分页处理模型
 
-                         if (! ! $sort && ! $suffix && ! $err) {
 
-                             if ($sort->type == 1) {
 
-                                 $this->getAboutPage($sort);
 
-                             } else {
 
-                                 $this->getListPage($sort);
 
-                             }
 
-                         } else {
 
-                             _404('您访问的页面不存在,请核对后重试!');
 
-                         }
 
-                     }
 
-             }
 
-         } else {
 
-             if(SITE_DIR == ''){
 
-                 //一级目录
 
-                 $this->urlJump($url_rule_type,false);
 
-             } else {
 
-                 //二级目录
 
-                 $this->urlJump($url_rule_type,true);
 
-             }
 
-         }
 
-     }
 
-     // 首页
 
-     private function getIndexPage()
 
-     {
 
-         $content = parent::parser($this->htmldir . 'index.html'); // 框架标签解析
 
-         $content = $this->parser->parserBefore($content); // CMS公共标签前置解析
 
-         $content = str_replace('{pboot:pagetitle}', $this->config('index_title') ?: '{pboot:sitetitle}-{pboot:sitesubtitle}', $content);
 
-         $content = $this->parser->parserPositionLabel($content, - 1, '首页', SITE_INDEX_DIR . '/'); // CMS当前位置标签解析
 
-         $content = $this->parser->parserSpecialPageSortLabel($content, 0, '', SITE_INDEX_DIR . '/'); // 解析分类标签
 
-         $content = $this->parser->parserAfter($content); // CMS公共标签后置解析
 
-         $this->cache($content, true);
 
-     }
 
-     // 列表
 
-     private function getListPage($sort)
 
-     {
 
-         // 调用栏目语言与当前语言不一致时,自动切换语言
 
-         if ($sort->acode != get_lg() && Config::get('lgautosw') !== '0') {
 
-             cookie('lg', $sort->acode);
 
-         }
 
-         if ($sort->listtpl) {
 
-             $this->checkPageLevel($sort->gcode, $sort->gtype, $sort->gnote);
 
-             $content = parent::parser($this->htmldir . $sort->listtpl); // 框架标签解析
 
-             $content = $this->parser->parserBefore($content); // CMS公共标签前置解析
 
-             $pagetitle = $sort->title ? "{sort:title}" : "{sort:name}"; // 页面标题
 
-             $content = str_replace('{pboot:pagetitle}', $this->config('list_title') ?: ($pagetitle . '-{pboot:sitetitle}-{pboot:sitesubtitle}'), $content);
 
-             $content = str_replace('{pboot:pagekeywords}', '{sort:keywords}', $content);
 
-             $content = str_replace('{pboot:pagedescription}', '{sort:description}', $content);
 
-             $content = $this->parser->parserPositionLabel($content, $sort->scode); // CMS当前位置标签解析
 
-             $content = $this->parser->parserSortLabel($content, $sort); // CMS分类信息标签解析
 
-             $content = $this->parser->parserListLabel($content, $sort->scode); // CMS分类列表标签解析
 
-             $content = $this->parser->parserAfter($content); // CMS公共标签后置解析
 
-         } else {
 
-             error('请到后台设置分类栏目列表页模板!');
 
-         }
 
-         $this->cache($content, true);
 
-     }
 
-     // 详情页
 
-     private function getContentPage($data)
 
-     {
 
-         
 
-         // 调用内容语言与当前语言不一致时,自动切换语言
 
-         if ($data->acode != get_lg() && Config::get('lgautosw') !== '0') {
 
-             cookie('lg', $data->acode);
 
-         }
 
-         
 
-         // 读取模板
 
-         if (! ! $sort = $this->model->getSort($data->scode)) {
 
-             if ($sort->contenttpl) {
 
-                 $this->checkPageLevel($sort->gcode, $sort->gtype, $sort->gnote); // 检查栏目权限
 
-                 $this->checkPageLevel($data->gcode, $data->gtype, $data->gnote); // 检查内容权限
 
-                 $content = parent::parser($this->htmldir . $sort->contenttpl); // 框架标签解析
 
-                 $content = $this->parser->parserBefore($content); // CMS公共标签前置解析
 
-                 $content = str_replace('{pboot:pagetitle}', $this->config('content_title') ?: '{content:title}-{sort:name}-{pboot:sitetitle}-{pboot:sitesubtitle}', $content);
 
-                 $content = str_replace('{pboot:pagekeywords}', '{content:keywords}', $content);
 
-                 $content = str_replace('{pboot:pagedescription}', '{content:description}', $content);
 
-                 $content = $this->parser->parserPositionLabel($content, $sort->scode); // CMS当前位置标签解析
 
-                 $content = $this->parser->parserSortLabel($content, $sort); // CMS分类信息标签解析
 
-                 $content = $this->parser->parserCurrentContentLabel($content, $sort, $data); // CMS内容标签解析
 
-                 $content = $this->parser->parserCommentLabel($content); // 文章评论
 
-                 $content = $this->parser->parserAfter($content); // CMS公共标签后置解析
 
-             } else {
 
-                 error('请到后台设置分类栏目内容页模板!');
 
-             }
 
-         } else {
 
-             _404('您访问内容的分类已经不存在,请核对后再试!');
 
-         }
 
-         $this->cache($content, true);
 
-     }
 
-     // 单页
 
-     private function getAboutPage($sort)
 
-     {
 
-         // 调用栏目语言与当前语言不一致时,自动切换语言
 
-         if ($sort->acode != get_lg() && Config::get('lgautosw') !== '0') {
 
-             cookie('lg', $sort->acode);
 
-         }
 
-         
 
-         // 读取数据
 
-         if (! $data = $this->model->getAbout($sort->scode)) {
 
-             _404('您访问的内容不存在,请核对后重试!');
 
-         }
 
-         
 
-         if ($sort->contenttpl) {
 
-             $this->checkPageLevel($sort->gcode, $sort->gtype, $sort->gnote);
 
-             $content = parent::parser($this->htmldir . $sort->contenttpl); // 框架标签解析
 
-             $content = $this->parser->parserBefore($content); // CMS公共标签前置解析
 
-             $pagetitle = $sort->title ? "{sort:title}" : "{content:title}"; // 页面标题
 
-             $content = str_replace('{pboot:pagetitle}', $this->config('about_title') ?: ($pagetitle . '-{pboot:sitetitle}-{pboot:sitesubtitle}'), $content);
 
-             $content = str_replace('{pboot:pagekeywords}', '{content:keywords}', $content);
 
-             $content = str_replace('{pboot:pagedescription}', '{content:description}', $content);
 
-             $content = $this->parser->parserPositionLabel($content, $sort->scode); // CMS当前位置标签解析
 
-             $content = $this->parser->parserSortLabel($content, $sort); // CMS分类信息标签解析
 
-             $content = $this->parser->parserCurrentContentLabel($content, $sort, $data); // CMS内容标签解析
 
-             $content = $this->parser->parserCommentLabel($content); // 文章评论
 
-             $content = $this->parser->parserAfter($content); // CMS公共标签后置解析
 
-         } else {
 
-             error('请到后台设置分类栏目内容页模板!');
 
-         }
 
-         
 
-         $this->cache($content, true);
 
-     }
 
-     // 检查页面权限
 
-     private function checkPageLevel($gcode, $gtype, $gnote)
 
-     {
 
-         if ($gcode) {
 
-             $deny = false;
 
-             $gtype = $gtype ?: 4;
 
-             switch ($gtype) {
 
-                 case 1:
 
-                     if ($gcode <= session('pboot_gcode')) {
 
-                         $deny = true;
 
-                     }
 
-                     break;
 
-                 case 2:
 
-                     if ($gcode < session('pboot_gcode')) {
 
-                         $deny = true;
 
-                     }
 
-                     break;
 
-                 case 3:
 
-                     if ($gcode != session('pboot_gcode')) {
 
-                         $deny = true;
 
-                     }
 
-                     break;
 
-                 case 4:
 
-                     if ($gcode > session('pboot_gcode')) {
 
-                         $deny = true;
 
-                     }
 
-                     break;
 
-                 case 5:
 
-                     if ($gcode >= session('pboot_gcode')) {
 
-                         $deny = true;
 
-                     }
 
-                     break;
 
-             }
 
-             if ($deny) {
 
-                 $gnote = $gnote ?: '您的权限不足,无法浏览本页面!';
 
-                 if (session('pboot_uid')) { // 已经登录
 
-                     error($gnote);
 
-                 } else {
 
-                     if ($this->config('login_no_wait')) {
 
-                         location(Url::home('member/login', null, "backurl=" . urlencode(get_current_url())));
 
-                     } else {
 
-                         error($gnote, Url::home('member/login', null, "backurl=" . urlencode(get_current_url())));
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     //首页跳转并过滤注入字符
 
-     /*
 
-      * @param $type url模式
 
-      * @param $isSecSiteDir 是否为二级目录 boolean
 
-      * */
 
-     private function urlJump($type, $isSecSiteDir){
 
-         //首页开启了分页直接跳转
 
-         if(strpos($_SERVER['REQUEST_URI'],'/?page=') === 0){
 
-             $this->getIndexPage();
 
-         }
 
-         $http = is_https() ? 'https://' : 'http://';
 
-         $matches1 = '';
 
-         switch ($type){
 
-             //普通模式
 
-             case 1:
 
-                 $preg1 = '';
 
-                 if($isSecSiteDir === true){
 
-                     if($_SERVER['REQUEST_URI'] == SITE_DIR . '/index.php'){
 
-                         $preg1 = '/^\/.*?\/index.php/';
 
-                     } elseif($_SERVER['REQUEST_URI'] == '/index.php'){
 
-                         $preg1 = '/^\/index.php/';
 
-                     }
 
-                 } else {
 
-                     $preg1 = '/^\/index.php/';
 
-                 }
 
-                 preg_match($preg1,$_SERVER['REQUEST_URI'],$matches1);
 
-                 break;
 
-             //伪静态
 
-             case 2:
 
-                 $preg2 = '';
 
-                 if($isSecSiteDir === true){
 
-                     if($_SERVER['REQUEST_URI'] == SITE_DIR . '/'){
 
-                         $preg2 = '/^\/.*/';
 
-                     } elseif($_SERVER['REQUEST_URI'] == '/'){
 
-                         $preg2 = '/^\/$/';
 
-                     }
 
-                 } else {
 
-                     $preg2 = '/^\//';
 
-                 }
 
-                 preg_match($preg2,$_SERVER['REQUEST_URI'],$matches1);
 
-                 break;
 
-             //兼容模式
 
-             case 3:
 
-                 $preg3 = '';
 
-                 if($isSecSiteDir === true){
 
-                     if(strpos($_SERVER['REQUEST_URI'], SITE_DIR) === 0){
 
-                         $preg3 = '/(^\/.*?\/index.php)|(^\/.*)/';
 
-                     } elseif(strpos($_SERVER['REQUEST_URI'], '/') === 0){
 
-                         $preg3 = '/(^\/index.php)|(^\/)/';
 
-                     }
 
-                 } else {
 
-                     $preg3 = '/(^\/index.php)|(^\/)/';
 
-                 }
 
-                 preg_match($preg3,$_SERVER['REQUEST_URI'],$matches1);
 
-                 break;
 
-         }
 
- //        if(strpos($matches1[0],'/?page=') !== 0 || $matches1[0]){
 
- //            $this->getIndexPage();
 
- //        }
 
- //        if(strpos($_SERVER['REQUEST_URI'],'?page') !== 0){
 
- //            $this->getIndexPage();
 
- //        }
 
-         if($matches1[0]){
 
-             if($_SERVER['REQUEST_URI'] == $matches1[0]){
 
-                 $this->getIndexPage();
 
-             } elseif(strpos($matches1[0],'/?page=') !== false) {
 
-                 $this->getIndexPage();
 
-             }else{
 
-                 //读取后台首页404访问配置
 
-                 if($this->config('url_index_404') == 1){
 
-                     _404('您访问的页面不存在,请核对后重试!');
 
-                 }
 
-                 header("Location: " . $http . $_SERVER['HTTP_HOST'] . $matches1[0], true, 301);
 
-             }
 
-         } else {
 
-             _404('您访问的页面不存在,请核对后重试!');
 
-         }
 
-     }
 
- }
 
 
  |