admin管理员组

文章数量:1632802

一.  入口文件的隐藏

ThinkPHP是一个单入口的框架,所有的请求都通过public下的index.php接受,并由该文件转发到相应的功能代码中,在index.php中,ThinkPhP通过加载框架引导文件实现请求过滤等级制。

因为所有的请求都需要通过index.php,所以我们在访问页面的时候,都需要在url中添加index.php才可以正确访问,比如http://localhost/index.php/index/index/index,为了解决这个问题,一般我们会选择将index.php隐藏,也就是隐藏入口文件。

隐藏入口文件的步骤主要分为如下几步:打开apache安装目录中的httpd.confg,修改以下内容:

在173行左右,开启以下扩展:LoadModule rewrite_module modules/mod_rewrite.so

在Directory标签中,将AllowOverride none 设置为AllowOverride All

重启apache

将.htacess内容修改为以下内容:

Options +FollowSymlinks -Multiviews

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]

值得注意的是,如果你是使用WAMP搭建的环境,那么不需要修改.htacess,而是需要httpd-vhost.conf文件中添加重写规则[1]

//开启重写

RewriteEngine on

//哪些文件路径不定义重写,我的css和js等文件是放在public路径下,所以在视图文件中以/public开头的url不重写路径(注意'/'需要使用'\’来进行转义)

RewriteCond $1 !^(index\.php|\/public)

//重写规则:可以不需要输入index.php来进行访问

RewriteRule ^(.*)$ /index.php/$1 [L]

//虚拟主机路径

DocumentRoot "C:/****/project/lsm/"

//虚拟主机访问地址自定义

ServerName lings.dev

Options Indexes FollowSymLinks

AllowOverride None

Order allow,deny

Allow from all

此时直接访问http://localhost/index/index/index便可以正确获取指定内容,而不需要再添加index.php

二.  入口文件的绑定

虽然我们通过隐藏入口文件隐藏了url中的index.php,但是模块名依旧需要我们输入,我们可以通过入口文件绑定来解决这个问题。

在/app/index/controlelr/Index.php中,添加test方法:

public function test()

{

return "test";

}

此时访问http://localhost/index/index/test,则页面显示test,那么如何将index/index也隐藏掉呢,我们可以直接在/public/index.php中,绑定index模块和index控制器:

// 定义应用目录

define('APP_PATH', __DIR__ . '/../app/');

//自定义常量

define('SITE_URL','http://localhost/blog');

//绑定模块

//define('BIND_MODULE','index'); //此时只需要访问http://localhost/index/test即可

//绑定模块和控制器

define('BIND_MODULE','index/index'); //此时只需要访问http://localhost/test即可

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

虽然通过上述的方法可以隐藏模块或者控制器,但是也会存在其他问题,按照上面的方式绑定后,只有index模块可以正常访问,而admin模块下的方法便会报错,所以一般小项目只有单个模块的站点会采用上述的方式,而复杂一点的大项目会采用下面的方式。

假如现在我们的网站需要提供一个接口给第三方一些数据,我们一般会添加另外一个入口文件,在/public下复制index.php并更名为api.php,此时访问http://localhost/api.php,显示的依旧是/app/index/controller/Index.php中的index方法的内容,说明api.php和index.php的作用是相同的,接下来在api.php中定义BIND_MODULE:

// 定义应用目录

define('APP_PATH', __DIR__ . '/../app/');

//绑定模块

define('BIND_MODULE','api');

// 加载框架引导文件

require __DIR__ . '/../thinkphp/start.php';

此时再访问http://localhost/api.php,访问便不再是/app/index/controller/Index.php中的index方法的内容,而是/app/api/controller/Index.php中的index方法的内容,除了在api.php中绑定api模块这种方式外,我们还可以直接在/app/config.php中,将 入口自动绑定模块设置为true,可以达到同样的效果:

'auto_bind_module' => true,

而且假如/app/api/controller/Index.php中有一个test方法,我们也不需要再访问http://localhost/api.php/api/index/test,直接访问http://localhost/api.php/index/test即可

三.  路由

首先在/app/index/controller/Index.php添加info方法:

public function info($name)

{

return "{$name}";

}

此时访问http://localhost/index/index/info/name/zhangjia (zhangjia.html也可以),页面显示zhangjia,可以看到url非常的臃肿,便引出了路由的概念,路由的作用是简化URL访问地址,并根据定义的路由类型做出正确的解析。

编辑/app/route.php,添加以下内容开启路由:

'info/:name' => '/index/index/info'

在info方法中添加url助手函数根据路由规则生成url:

public function info($name)

{

echo url('index/index/info',['name' =>'zj'])."
";

return "{$name}";

}

此时直接访问http://localhost/index/index/info/name/zhangjia会报错,而访问http://localhost/info/zhangjia显示以下内容:

/info/zj.html

zhangjia

另外关于路由常用的两个配置是

// 是否开启路由

'url_route_on' => true,

// 是否强制使用路由

'url_route_must' => false,

如果将强制使用路由设置为true,那么每个url都会按照路由的规则来访问,所以一般将其设置为false

参考资料

本文标签: 路由配置文件入口文件PHP