本节首先介绍了系统多个请求入口设计带来的不便,然后介绍了单一请求入口设计模式实现原理。本节的学习目标是明确单一入口文件设计模式的优点,避免在以后的开发项目中出现多入口。
1. 入口文件设计
系统中凡是能够被访问的PHP文件称为入口文件。如果用户的不同请求直接对应到Web服务器中的不同PHP文件,即系统是多入口设计。在刚开始学习 PHP的时候,通常一个项目都会这样做:
 index.php - 网站首页
 list.php?page=5 - 内容列表页
 info.php?id=12 - 内容详细页
 login.php - 用户登录页
又或者在上一小节实现MVC框架模式后,访问不同的控制器类文件,如DefaultController.php或SiteController.php。

对于这些项目来说,都有多个入口文件,随着项目规模的不断扩大,多入口的设计缺陷也会越来越明显,如系统目录结构混乱,后期维护困难,容易暴露程序漏洞,不便于系统的统一管理等。为了避免多入口设计带来的诸多问题,可以使用单一入口设计模式。单一入口设计模式就是一个文件处理所有的HTTP请求,也就是说访问任何控制器文件,不管是DefaultController.php、SiteController.php还是其他控制器类文件。每一次请求都是指向服务器的同一个文件,如入口文件index.php,该文件负责URL解析,最终转向所要访问的页面,即如图1-6所示。

图1-6  单一入口文件模式
PHP单一入口模式可谓是现在一种比较流行的大型Web应用开发模式,比如当前比较流行的一些PHP开发框架,Zend、Thinkphp,还有Yii 等都是采用单一入口模式。
使用单一入口文件模式的优点,如下所示。
 更加安全。单一入口模式给用户提供了单一的请求入口,所以我们在入口文件可以对请求进行过滤,加入安全处理代码,而传统的多请求入口模式需要为每个文件都加入安全处理程序块。
 模块化程度高。开发人员只需关注自己所开发的模块,开发人员之间不需考虑程序是否正常运行,因为这一切全部交给入口文件来协调。
 便于统一管理,定制性强。系统的所有模块都由入口文件进行统一管理,任何一个模块可以不经模块本身启用或禁用。

2. 入口文件中实现URL的解析
在上一节中提到入口文件的URL解析,即入口文件会将原始请求转发给相应的处理控制器,去完成具体的业务处理。如果URL地址如下。

http://<serverip>/
http://<serverip>/index.php
http://<serverip>/index.php?r=site
http://<serverip>/index.php?r=site/index

提示:自定义框架模仿Yii框架采用路径(PATH)URL模式访问规则。路径URL模式采用目录分层的思想,路径格式简洁,URL解析效率高,此URL格式为:http://<serverip>/appname/index.php?r=controllerID/actionID
我们希望上面所有URL被解析后都会访问SiteController控制器的actionIndex()方法。URL解析执行流程如图1-7所示,首先访问入口文件,在其中分析请求URL的参数,在没有“r”参数的情况下默认访问SiteController的actionIndex()方法,否则依据“r”参数访问SiteController的actionIndex()方法。即所有的访问由URL的参数来统一解析和调度。

图1-7  URL解析执行流程图
入口文件index.php中代码实现如下。

<?php//默认控制器是SiteController$defaultController="site";//默认动作actionIndex$defaultAction="index"; //http://localhost/index.php?r=controllerid/actionid//得到controllerid/actionidif(!empty($_GET['r'])){$route=$_GET['r'];//得到controllerid赋值给成员变量$pos=strpos($route,'/');$defaultController=substr($route,0,$pos);$defaultController=strtolower($defaultController);//得到actionid赋值给成员变量$defaultAction=(string)substr($route,$pos+1);}//得到控制器类名$className=ucfirst($defaultController).'Controller';//获得控制器文件路径$classFile="./controllers/".$className.'.php';//最后一步操作:该类文件存在则导入,该类存在则创建对象并调用acion方法。if(is_file($classFile)){if(!class_exists($className,false)){require($classFile);$class= new $className();$functionName="action".ucfirst($defaultAction);$class->$functionName();} }
?>

由上面的程序可知,默认的控制器是SiteController,默认的执行方法是actionIndex()方法。控制器的类名首字母大写,以“Controller”结尾,且控制器类文件必须保存在controllers文件夹中;动作方法名必须以“action”为前缀,acitonID首字母大写。从这段程序中也可以了解到代码规范的重要性,因为文件名或类名等都会在程序中使用。同样的道理,在将要学习的Yii框架开发过程中,也要遵守一定的编码规范。例如:命名变量、方法和类时使用驼峰风格,即每个单词的首字母大写并连在一起,中间无空格;变量名和方法名应该使它们的第一个单词全部小写,以使其区别于类名,如:$basePath, runController();对私有类成员变量来说,推荐以下划线作为其名字前缀,如:$_actionList。
提示:为了使PHP语言开发的框架能够遵循共同的编码风格,在2009年由几个框架的开发者组成PHP-FIG(PHP Framework Interoperability Group)小组,一直扩展到现在已经拥有20多位成员。

实现入口文件后,框架执行流程如图1-8所示。

1. 用户发出了访问 URL 的请求,Web 服务器通过执行入口脚本index.php处理此请求。
2. 入口文件负责完成URL的解析,根据URL请求创建控制器并调用动作处理用户请求。
3. 控制器调用模型实例对象从数据库中读取数据。
4. 渲染视图。
5. 视图读取并显示模型的数据。
6. 动作完成视图渲染并将其返回给用户。

3. 单一入口模式服务器环境配置

实现单一入口模式之后,需要确保应用根目录下,除入口文件外的PHP文件(所有安全敏感的PHP文件)都不允许访问。通过实践证明使用Apache服务器的目录级配置文件.htaccess文件保护目录比使用其它方式更为有效和安全。更重要的是,使用.htaccess的方式进行设置,不需要编写程序就可以实现,具体操作比较容易。

(1)目录级配置文件.htaccess

.htaccess是一个纯文本文件,里面存放着Apache服务器配置相关的一些指令,它类似于Apache的站点配置文件,如httpd.conf文件。.htaccess与httpd.conf配置文件不同的是,它只作用于此目录及其所有子目录。另外httpd.conf是在Apache服务启动的时候就加载的,而.htaccess只有在用户访问目录时加载,所以修改.htaccess文件不需要重启Apache服务器。.htaccess的功能包括设置网页密码、设置发生错误时出现的文件、禁止读取文件、重新定向文件等。

在需要针对目录改变服务器的配置,而对服务器系统没有root权限时,应该使用.htaccess文件。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是在一台机器上提供多个用户站点,而又期望用户可以自己改变配置的情况下,一般会开放部分.htaccess的功能给使用者自行设置。

注意:.htacess是一个完整的文件名,不是***.htaccess或其它格式。

如何允许用户使用.htaccess文件呢?在Apache服务器的配置文件httpd.conf中,查找服务器的根目录的配置信息:

<Directory "e:/wamp/www/">

……

AllowOverride None

……

</Directory>

在此块配置项中,把“AllowOverride None”修改成“AllowOverride All”。即允许Apache服务器调用.htaccess文件,在需要时针对目录改变服务器的配置

提示:http.conf配置文件中的AllowOverride会根据设定的值决定是否读取目录中的.htaccess文件,来改变原来所设置的权限。为避免用户自行建立.htaccess文件修改访问权限,http.conf文件中默认设置每个目录为:AllowOverride  None。

All:读取.htaccess文件的内容,修改原来的访问权限。

None:不读取.htaccess文件

(2)实现禁止访问除入口文件之外的PHP文件

在Apache服务器的目录级配置文件.htaccess文件中添加“Deny from all”(表示全部IP地址都不许可。相对地 allow from all表示全部都允许。)即可实现包含该.htaccess的文件夹不允许被外部访问。接下来创建protected目录,并把需要被保护的文件移到该目录下即可。改造后的目录结构如下

│  index.php

├─css

├─framework

│      .htaccess

│      CController.php

├─images

├─js

└─protected

│ .htaccess

├─controllers

│      DefaultController.php

│      SiteController.php

├─models

│      Article.php

└─views

index.php

1.4.2 入口文件相关推荐

  1. ThinkPHP3.2URL重写隐藏应用的入口文件index.php

    可以通过URL重写隐藏应用的入口文件index.PHP,下面是相关服务器的配置参考: [ Apache ] httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverri ...

  2. php好的mvc中index方法,创建一个mvc应用目录架构并创建入口文件index.php

    摘要:<?php require 'vendor/autoload.php'; require 'pig/Base.php'; define('ROOT_PATH',__DIR__.'/'); ...

  3. 入口文件到控制器 php,workerman的入口文件_PHP开发框架教程

    使用thinkphp5对excel文件进行导出_PHP开发框架教程 有些人觉得excel导出很复杂,但其实很简单,两步操作即可完成想要的数据导出.第一步,将excel配置到thinkphp5框架的惯例 ...

  4. thinkcmf 去掉index.php,​ThinkCMF5.0如何修改入口文件 解决方法

    ThinkCMF如何修改入口文件?ThinkCMF5.0是基于ThinkPHP5.0开发和之前的ThinkCMF版本有了很大的变化. ThinkCMF默认的入口面页   http://www.你的网址 ...

  5. php如何隐藏入口文件,PHP怎样隐藏入口文件

    这次给大家带来PHP怎样隐藏入口文件,PHP隐藏入口文件的注意事项有哪些,下面就是实战案例,一起来看一下. 第一步:开启apache重写模块 重启apache LoadModule rewrite_m ...

  6. webpack 入口文件 php,webpack,jsx_webpack jsx 找不到入口文件,webpack,jsx - phpStudy

    webpack jsx 找不到入口文件 文件目录: ├── README.md ├── components │   ├── plists.jsx │   └── search.jsx ├── ind ...

  7. 如何不显示index.php,如何隐藏index.php入口文件?

    php中隐藏index.php入口文件的方法:首先加载[mod_rewrite.so]:然后更改AllowOverride配置:接着添加[.htaccess]文件Rewrite规则:最后更改项目配置文 ...

  8. android启动---lk入口文件crt0.s解析

    android启动---lk入口文件crt0.s解析 // .section 伪操作, 用户可以通过.section 伪操作来自定义一个段,每一个段以段名为开始, //以下一个段名或者文件结尾为结束, ...

  9. nginx给php做统一入口,Nginx如何来配置隐藏入口文件index.php(代码)

    这篇文章给大家介绍的内容是关于Nginx配置 隐藏入口文件index.php,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Nginx配置文件里放入这段代码server { loca ...

  10. thinkphp5/phpstudy分析入口文件index.php及localhost和配置域名访问网站根目录www

    文章目录 1.thinkphp5入口文件简介 2.访问网站根目录www (1)localhost访问网站根目录www (2)配置域名访问网站根目录www 第一步:点击站点域名管理 第二步:站点域名设置 ...

最新文章

  1. 3ds Max中的V-Ray学习
  2. No_16_0303 Java基础学习第十一天
  3. [置顶] C/C++超级大火锅
  4. Javascript如何改变数组的长度?
  5. linux目录结构简析
  6. cpu 内存占用比较高的解决方案
  7. 无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...
  8. math 计算float_Java Math类静态float min(float f1,float f2)与示例
  9. python权限不够cmd安装不了_python环境配置+matplotlib
  10. springbootSecurity的使用
  11. MySQL数据库与Oracle数据库中建表使用单引号和双引号的效果
  12. JVM初识之虚拟机内存结构
  13. MATLAB拟合优度检验
  14. Win10专业工作站版本激活并获得数字权利的方法和密钥
  15. linux网页版控制台,linux Web控制台
  16. 我的世界服务器mcyc.win怎么验证,RTX 2060 光线追踪效果逆天,让《我的世界》变仙境!华硕天选游戏笔记本体验教程...
  17. 计算机自动关机时间如何设置在哪设置方法,Win8设置电脑在某一个时间段自动关机的三种方法...
  18. 【总结】1396- 60+个 VSCode 插件,打造好用的编辑器
  19. 二、Eureka之server端集群节点发现,数据同步
  20. SlickEdit编码设置

热门文章

  1. 万恶的ie6下,select标记z-index无效问题
  2. 低电压穿越仿真分析LVRT-Simulink
  3. Java JUC主要内容
  4. SpringMVC发送Email 邮件
  5. IBM联手Hacera推出基于区块链网络的分布式“黄页”系统
  6. 四年耕耘 硕果累累|汇佳学校高尔夫双优班第四届开学典礼隆重举办
  7. Linux中的文件管理
  8. 计算机网络教育的论文,计算机网络课程论文范文
  9. 获取元素在渲染数据前后的问题
  10. oracle rac告警,rac故障大家看一下,结点的告警日志缺失,主要和smon进程入手的...