ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案

Posted qikexun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案相关的知识,希望对你有一定的参考价值。

用伪静态,把文章的路径设置成qiyet.cn/category1/category2/id.html 这样的格式。其中,涉及到两个参数,分类和id.于是,

遇到一个全动态路由设置的问题,问了很多人都没人解决,还是知乎上人才众多,竟然给解决了,就是绑定模块,加一个判断,我的路由配置局部代码如下:

switch(strtolower(BIND_MODULE))	
	case 'index':
		// index模块路由定义
        Route::rule(':cate/:id','index/goods/index');
       Route::get('<name>/<id>','index/goods/index',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);//推荐使用这个格式,以上的格式容易冲突
		break;
	case 'admin':
		// admin模块路由定义
		break;
	default:		

代码真是简洁又优雅,为了向作者致敬,写入原文来源地址:https://zhuanlan.zhihu.com/p/134238563

如果你的路由规则比较特殊,可以在路由定义的时候使用组合变量。

例如:

Route::get('item-<name>-<id>','product/detail',[],['name'=>'\\w+','id'=>'\\d+']);

组合变量的优势是路由规则中没有固定的分隔符,可以随意组合需要的变量规则,例如路由规则改成如下一样可以支持:

Route::get('item<name><id>','product/detail',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);
Route::get('item@<name>-<id>','product/detail',[],['name'=>'\\w+','id'=>'\\d+']);

如果需要使用可选变量,则可以使用:

Route::get('item-<name><id?>','product/detail',[],['name'=>'[a-zA-Z]+','id'=>'\\d+']);

关于define(BIND_MODULE)的定义问题

define(BIND_MODULE)这个定义在哪个文件里面?

另外,为了以后方便查找和供后来人参考,摘抄备份如下:

我们在应用Thinkphp5进行系统开发时,为了巩固后台安全,常常利用多入口机制来隐藏后台地址,在此以index和admin两个模块举例说明具体实现步骤及问题解决方案:

1:建立后台入口文件 如 admin.php,内容为:

<?php
// 定义应用目录
define('APP_PATH', __DIR__ . '/application/');
// 绑定当前入口文件到admin模块
define('BIND_MODULE','admin');
// 加载框架基础文件
require __DIR__ . '/thinkphp/start.php';

2:在配置文件config.php设置:

<?php
// 禁止访问模块
'deny_module_list'       => ['common','admin'],

来禁止admin模块访问。

3:但在实际开发时,发现多模块多入口情况下,全局路由可能会同时影响index和admin模块,比如路由定义:

<?php
Route::rule('product/:id', 'index/Product/read');
Route::rule('product', 'index/Product/index');

实测中发现如果admin模块中也有product控制器及product控制器中有index方式,会报错:模块不存在:如下图

鉴于此,试图网上搜索TP5的路由按模块配置的解决方案,有改源码的,有利用路由分组,有截取URL按条件设置路由的等等,结果尝试了都不太好用,在此给出的解决方案是:

在index入口文件中显式绑定index模块:

<?php
// 绑定当前入口文件到index模块
define('BIND_MODULE','index');

这样,前台绑定index,后台绑定admin,我们就可以利用常量BIND_MODULE进行路由按模块定义:

<?php
switch(strtolower(BIND_MODULE))	
	case 'index':
		// index模块路由定义
		Route::rule('product/:id', 'index/Product/read');
		Route::rule('product', 'index/Product/index');
		break;
	case 'admin':
		// admin模块路由定义
		break;
	default:		

经测试,解决后台地址隐藏及路由分模块定义同时没有发现系统异常。

以上是关于ThinkPHP5只让路由对index作用,不对admin作用。多模块多入口方式隐藏后台地址及路由冲突解决方案的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp5.1在nginx环境路由不论怎么修改路由,都只能指向index控制器index方法

ThinkPHP5 (路径优化,路由)

thinkphp5学习

thinkphp5三种URL访问模式

如何在nginx安装thinkphp5并且开启路由

关于thinkphp配置路由无效果的解决方案