admin管理员组文章数量:1632798
一. 入口文件的隐藏
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路由访问配置文件,6:ThinkPHP入口文件配置和路由 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1729141958a1187668.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论