shopnc路由功能分析
项目核心文件
core/shopld.php
if (!@include(BASE_DATA_PATH.'/config/config.ini.php')) exit('config.ini.php isn\'t exists!');
if (file_exists(BASE_PATH.'/config/config.ini.php')){
include(BASE_PATH.'/config/config.ini.php');
}
global $config; //默认平台店铺id
define('DEFAULT_PLATFORM_STORE_ID', $config['default_store_id']); define('URL_MODEL',$config['url_model']);
define(SUBDOMAIN_SUFFIX, $config['subdomain_suffix']); define('SHOP_SITE_URL', $config['shop_site_url']);
define('CMS_SITE_URL', $config['cms_site_url']);
define('CIRCLE_SITE_URL', $config['circle_site_url']);
define('MICROSHOP_SITE_URL', $config['microshop_site_url']);
define('ADMIN_SITE_URL', $config['admin_site_url']);
define('MOBILE_SITE_URL', $config['mobile_site_url']);
define('WAP_SITE_URL', $config['wap_site_url']);
define('UPLOAD_SITE_URL',$config['upload_site_url']);
define('RESOURCE_SITE_URL',$config['resource_site_url']); define('BASE_DATA_PATH',BASE_ROOT_PATH.'/data');
define('BASE_UPLOAD_PATH',BASE_DATA_PATH.'/upload');
define('BASE_RESOURCE_PATH',BASE_DATA_PATH.'/resource'); define('CHARSET',$config['db'][1]['dbcharset']);
define('DBDRIVER',$config['dbdriver']);
define('SESSION_EXPIRE',$config['session_expire']);
define('LANG_TYPE',$config['lang_type']);
define('COOKIE_PRE',$config['cookie_pre']);
define('DBPRE',($config['db'][1]['dbname']).'`.`'.($config['tablepre'])); $_GET['act'] = $_GET['act'] ? strtolower($_GET['act']) : ($_POST['act'] ? strtolower($_POST['act']) : null);
$_GET['op'] = $_GET['op'] ? strtolower($_GET['op']) : ($_POST['op'] ? strtolower($_POST['op']) : null); if (empty($_GET['act'])){
require_once(BASE_CORE_PATH.'/framework/core/route.php');
new Route($config);
}
//统一ACTION
$_GET['act'] = preg_match('/^[\w]+$/i',$_GET['act']) ? $_GET['act'] : 'index';
$_GET['op'] = preg_match('/^[\w]+$/i',$_GET['op']) ? $_GET['op'] : 'index'; //对GET POST接收内容进行过滤,$ignore内的下标不被过滤
$ignore = array('article_content','pgoods_body','doc_content','content','sn_content','g_body','store_description','p_content','groupbuy_intro','remind_content','note_content','ref_url','adv_pic_url','adv_word_url','adv_slide_url','appcode','mail_content');
if (!class_exists('Security')) require(BASE_CORE_PATH.'/framework/libraries/security.php');
$_GET = !empty($_GET) ? Security::getAddslashesForInput($_GET,$ignore) : array();
$_POST = !empty($_POST) ? Security::getAddslashesForInput($_POST,$ignore) : array();
$_REQUEST = !empty($_REQUEST) ? Security::getAddslashesForInput($_REQUEST,$ignore) : array();
$_SERVER = !empty($_SERVER) ? Security::getAddSlashes($_SERVER) : array(); //启用ZIP压缩
if ($config['gzip'] == 1 && function_exists('ob_gzhandler') && $_GET['inajax'] != 1){
ob_start('ob_gzhandler');
}else {
ob_start();
} require_once(BASE_CORE_PATH.'/framework/function/core.php');
require_once(BASE_CORE_PATH.'/framework/core/base.php'); require_once(BASE_CORE_PATH.'/framework/function/goods.php'); if(function_exists('spl_autoload_register')) {
spl_autoload_register(array('Base', 'autoload'));
} else {
function __autoload($class) {
return Base::autoload($class);
}
}
路由解析文件位于core/framework/core/route.php 主要控制路由功能和伪静态功能
<?php
/**
* 路由
*
* @copyright Copyright (c) 2014-2015 shopld Inc.
* @license
* @link
* @since File available since Release v1.0
*/
defined('InSC') or exit('Access Invalid!'); class Route { /**
* PATH_INFO 分隔符
*
* @var string
*/
private $_pathinfo_split = '-'; /**
* 系统配置信息
*
* @var array
*/ private $_config = array(); /**
* PATH_INFO内容分隔正则
*
* @var string
*/
private $_pathinfo_pattern = ''; /**
* 伪静态文件扩展名
*
* @var string
*/
private $_rewrite_extname = '.html'; /**
* 构造方法
*
*/
public function __construct($config = array()) {
$this->_config = $config;
$this->_pathinfo_pattern = "/{$this->_pathinfo_split}/";
$this->parseRule();
} /**
* 路由解析
*
*/
public function parseRule() {
if ($this->_config['url_model']) {
$this->_parseRuleRewrite();
} else {
$this->_parseRuleNormal();
}
} /**
* 默认URL模式
*
*/
private function _parseRuleNormal() {
//不进行任何处理
} /**
* 伪静态模式
*
*/
private function _parseRuleRewrite() {
//$_SERVER['path_info']包含真实脚本名称之后,并且在查询语句之前的信息,如果当前脚本是通过 URL http://www.example.com/php/path_info.php/some/stuff?foo=bar 被访问,那么 $_SERVER['PATH_INFO'] 将包含 /some/stuff。
//$_SERVER['REDIRECT_REDIRECT_PATH_INFO']
$path_info = !empty($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $_SERVER['REDIRECT_REDIRECT_PATH_INFO'];
$path_info = trim($path_info,'/'); //如果为二级目录去掉目录信息
if(strpos($path_info, '/')) {
$path_info_array = explode('/', $path_info);
$path_info = end($path_info_array);
} if (!empty($path_info) && $path_info != 'index.php' && strpos($path_info, $this->_rewrite_extname)){
//去掉伪静态扩展名
$path_info = substr($path_info,0,-strlen($this->_rewrite_extname)); //根据不同APP匹配url规则
$path_info_function = '_' . APP_ID . 'PathInfo';
$path_info = $this->$path_info_function($path_info); $split_array = preg_split($this->_pathinfo_pattern,$path_info);
//act,op强制赋值
$_GET['act'] = isset($split_array[0]) ? $split_array[0] : 'index';
$_GET['op'] = isset($split_array[1]) ? $split_array[1] : 'index';
unset($split_array[0]);
unset($split_array[1]); //其它参数也放入$_GET
while (current($split_array) !== false) {
$name = current($split_array);
$value = next($split_array);
$_GET[$name] = $value;
if (next($split_array) === false){
break;
}
}
} else {
$_GET['act'] = $_GET['op'] = 'index';
}
} /**
* 商城短网址还原成长网址
* @param unknown $path_info
* @return mixed
*/
private function _shopPathInfo($path_info) {
$reg_match_from = array(
'/^item-(\d+)$/',
'/^shop-(\d+)$/',
'/^shop_view-(\d+)-(\d+)-([0-5])-([0-2])-(\d+)$/',
'/^article-(\d+)$/',
'/^article_cate-(\d+)$/',
'/^document-([a-z_]+)$/',
'/^cate-(\d+)-([0-9_]+)-([0-9_]+)-([0-3])-([0-2])-([0-2])-(\d+)-(\d+)$/',
'/^brand-(\d+)-([0-3])-([0-2])-([0-2])-(\d+)-(\d+)$/',
'/^brand$/',
'/^groupbuy-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_soon-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_history-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/',
'/^groupbuy_detail-(\d+)$/',
'/^integral$/',
'/^integral_list$/',
'/^integral_item-(\d+)$/',
'/^voucher$/',
'/^comments-(\d+)-([0-3])-(\d+)$/',
'/^special-(\d+)$/'
);
$reg_match_to = array(
'goods-index-goods_id-\\1',
'show_store-index-store_id-\\1',
'show_store-goods_all-store_id-\\1-stc_id-\\2-key-\\3-order-\\4-curpage-\\5',
'article-show-article_id-\\1',
'article-article-ac_id-\\1',
'document-index-code-\\1',
'search-index-cate_id-\\1-b_id-\\2-a_id-\\3-key-\\4-order-\\5-type-\\6-area_id-\\7-curpage-\\8',
'brand-list-brand-\\1-key-\\2-order-\\3-type-\\4-area_id-\\5-curpage-\\6',
'brand-index',
'show_groupbuy-index-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_soon-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_history-area_id-\\1-groupbuy_class-\\2-groupbuy_price-\\3-groupbuy_order_key-\\4-groupbuy_order-\\5-curpage-\\6',
'show_groupbuy-groupbuy_detail-group_id-\\1',
'pointprod-index',
'pointprod-plist',
'pointprod-pinfo-id-\\1',
'pointvoucher-index',
'goods-comments_list-goods_id-\\1-type-\\2-curpage-\\3',
'special-special_detail-special_id-\\1'
);
return preg_replace($reg_match_from,$reg_match_to,$path_info);
} /**
* CMS短网址还原成长网址
* @param unknown $path_info
* @return mixed
*/
private function _cmsPathInfo($path_info) {
$reg_match_from = array(
'/^article-(\d+)$/',
'/^picture-(\d+)$/'
);
$reg_match_to = array(
'article-article_detail-article_id-\\1',
'picture-picture_detail-picture_id-\\1'
);
return preg_replace($reg_match_from,$reg_match_to,$path_info);
} }
shopnc路由功能分析的更多相关文章
- 07. vue-router嵌套路由
嵌套路由用法 1.嵌套路由功能分析 点击父级路由链接显示模板内容 模板内容中又有子级路由链接 点击子级路由链接显示子级模板内容 2.父路由组件模板 父级路由链接 父组件路由填充位 <p> ...
- 四、vue前端路由(轻松入门vue)
轻松入门vue系列 Vue前端路由 七.Vue前端路由 1. 路由的基本概念与原理 后端路由 前端路由 实现简单的前端路由 vue-router基本概念 2. vue-router的基本使用 基本使用 ...
- 01-02 Flutter仿京东商城项目 功能分析、底部导航Tab切换以及路由配置、架构搭建:(Flutter仿京东商城项目 首页布局以及不同终端屏幕适配方案)
Flutter和Dart交流学习群:交流群:452892873 01Flutter仿京东商城项目 功能分析.底部导航Tab切换以及路由配置.架构搭建 02Flutter仿京东商城项目 首页布局以及不同 ...
- 理解 OpenStack 高可用(HA)(3):Neutron 分布式虚拟路由(Neutron Distributed Virtual Routing)
本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- .NetCore MVC中的路由(2)在路由中使用约束
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
随机推荐
- shell编程 条件判断式----利用 case ..... esac 判断
条件判断式----利用 case ..... esac 判断 case $变量名称 in <==关键词为 case ,还有变量前有钱字号 "第一个变量内容") &l ...
- JMeter(7) 优化判断返回类型和返回值
之前判断接口类型和返回值用beanshell,可见JMeter(5)-JMeter之BeanShell使用 优化点 接口测试里面对返回字段的类型验证和值验证为基本需求,将方法导成jar文件,导入之后方 ...
- Codeforces Round #375 (Div. 2) D. Lakes in Berland 并查集
http://codeforces.com/contest/723/problem/D 这题是只能把小河填了,题目那里有写,其实如果读懂题这题是挺简单的,预处理出每一块的大小,排好序,从小到大填就行了 ...
- 牛客网Java刷题知识点之什么是异常、异常处理的原理是什么、为什么要使用异常、异常体系、运行时异常、普通异常、自定义异常、异常链
不多说,直接上干货! 在这个世界不可能存在完美的东西,不管完美的思维有多么缜密,细心,我们都不可能考虑所有的因素,这就是所谓的智者千虑必有一失.同样的道理,计算机的世界也是不完美的,异常情况随时都会发 ...
- 《从0到1学习Flink》—— Data Source 介绍
前言 Data Sources 是什么呢?就字面意思其实就可以知道:数据来源. Flink 做为一款流式计算框架,它可用来做批处理,即处理静态的数据集.历史的数据集:也可以用来做流处理,即实时的处理些 ...
- mui的picker组件填坑
在公司项目用到mui,vue进行开发 import mui from './assets/js/mui.min.js'后 加window.mui = mui再 import './assets/js/ ...
- 13.JAVA-包package、import使用
1.包的定义 之前我们学习java时,生成的class文件都是位于当前目录中,假如出现了同名文件,则会出现文件覆盖问题,因此就需要设置不同的目录(定义包),来解决同名文件冲突问题. 并且在大型项目中, ...
- Java中的日志框架
日志框架的介绍和使用 常见的日志框架:JUL(Java.util.logging),JCL(jakarta commons logging),SLF4J,jboss-logging,Log4j,Log ...
- BZOJ4299: Codechef FRBSUM(主席树)
题意 题目链接 数集S的ForbiddenSum定义为无法用S的某个子集(可以为空)的和表示的最小的非负整数. 例如,S={1,1,3,7},则它的子集和中包含0(S’=∅),1(S’={1}),2( ...
- php 判断字符串中是否包含另一个字符串 strpos
strpos (PHP 4, PHP 5, PHP 7) strpos — 查找字符串首次出现的位置 说明 strpos ( string $haystack , $needle [, int $o ...