PHP单一入口模式及URL路由美化

大部分PHP框架都是基于单一入口模式,如Laravel,yii,ci,tp等,且配置都非常简单。最近想把自己以前写的一个零散的项目(全是单文件模式)整理成单一入口模式,于是研究了下,实现了基本可用的功能。包括URL路由,美化功能。


PHP中的单一入口模式

所谓单一入口,就是所有的http请求都通过一个文件来处理后,再交给各个对应php文件处理。单一入口的好处很明显,防止暴露给外界更多的信息,且可以很方便的记录请求,安全性检查。在入口里,我们还可以对url参数和post进行必要的检查和特殊字符过滤、记录日志、访问统计等等各种可以集中处理的任务。

实现

可能首先想到的实现是一堆if else、或者一堆switch case。这是最简单的实现, 但这种太麻烦。
其实可以更加简单。
假设项目分为各个模块,每个模块对应一个文件夹。文件夹里面存放的是各个php文件。
实现代码如下index.php。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$url = isset($_GET['url'])? $_GET['url']:''; //目录
$action = isset($_GET['action'])? $_GET['action']:''; //文件
$filePath = $url.'/'.$action.'.php';
if(file_exists($filePath)){
include($filePath);//包含就会直接调用
}else{
header('HTTP/1.1 404 Not Found');
header('status: 404 Not Found');
include("errors/404.html");//跳转到404页面
exit();
}

其中url对应模块目录,action对应文件名,拼接之后直接include即可。
那么访问news/abc.php?id=1(news目录下有个abc.php,需要传id参数)的形式就变为index.php?url=news&action=abc&id=1的形式了。

而且旧代码也不用动,只是参数变多了。

URL路由与美化

上面单一入口访问的URL无疑看起来很难看,离我们平日里见到的网站URL相差十万八千里。接下来写美化URL。
以apache服务器为例。如果要重新定义URL需要开启apache 的 mod_rewrite 模块。
步骤如下:

1.开启 apache的mod_rewrite模块

1.1 找到apache的配置文件httpd.conf;
1.2 去掉LoadModule rewrite_module modules/mod_rewrite.so前的“#”符号;
1.3 查找httpd.conf文件, 把 AllowOverride None 修改为 AllowOverride All;

2.编写.htaccess文件中的URL美化规则

.htaccess文件编写规则

注意: .htaccess文件创建在index.php入口文件同级目录即可。(windows上创建时,输入”.htaccess.”,最后多加一个点号)

如下一条规则:

1
2
RewriteEngine on
#RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)$ index.php?action=$1&id=$2

意思是当访问xxxx/index.php?action=abc&id=123时,将地址变为xxxx/abc/123的形式。
这样既去掉了index.php,也简化了参数样式。
前半部分中,^号表示开始符号,$表示结束符号。
([a-zA-Z0-9_-]+)括号中是正则表达式,第一个括号中的内容与后面的$1对应, 第二个括号中的内容与$2对应。
而且还可以直接在后面加.html做成伪静态页面。(\.表示转义)

1
2
RewriteEngine on
#RewriteRule ^([a-zA-Z0-9_-]+)/([0-9]+)\.html$ index.php?action=$1&id=$2

最后访问xxxx/abc/123.html即可。

.htaccess文件中还可以设置重定向,404页面等。

结语

在入口文件index.php中可以加一些统计信息等。但不能加过多,因为每次请求都会调用这个文件。

转载请注明出处,有疑问欢迎留言!