php 实现单一入口
单一入口实现方法
单一入口(Single Entry Point)是一种设计模式,所有请求通过一个入口文件(如index.php)处理,再由该文件根据参数分发到不同模块。以下是实现步骤:
入口文件配置
创建index.php作为入口文件,通过解析URL参数或路径决定加载的模块:
<?php
// 定义应用根目录
define('APP_ROOT', dirname(__FILE__));
// 解析请求路径
$request = $_SERVER['REQUEST_URI'];
$script = $_SERVER['SCRIPT_NAME'];
$path = str_replace($script, '', $request);
// 路由分发
if ($path === '/user') {
require APP_ROOT . '/modules/user.php';
} elseif ($path === '/product') {
require APP_ROOT . '/modules/product.php';
} else {
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
}
?>
URL重写配置
通过Apache或Nginx的URL重写功能隐藏入口文件:

-
Apache(
.htaccess):RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?path=$1 [L,QSA] -
Nginx:

location / { try_files $uri $uri/ /index.php?$query_string; }
路由解析优化
使用正则表达式或第三方库(如FastRoute)实现动态路由:
$dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
$r->addRoute('GET', '/user/{id:\d+}', 'UserController@show');
$r->addRoute('POST', '/product/create', 'ProductController@create');
});
$httpMethod = $_SERVER['REQUEST_METHOD'];
$uri = $_SERVER['REQUEST_URI'];
$routeInfo = $dispatcher->dispatch($httpMethod, $uri);
自动加载与依赖管理
结合Composer实现自动加载,避免手动引入文件:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
安全性增强
过滤输入参数并限制文件包含范围:
$allowedModules = ['user', 'product'];
$module = $_GET['module'] ?? '';
if (!in_array($module, $allowedModules)) {
die('Invalid module');
}
include APP_ROOT . "/modules/{$module}.php";
注意事项
- 避免直接使用
include或require包含用户可控参数,防止目录遍历攻击。 - 路由规则需覆盖所有可能的HTTP方法(GET/POST/PUT/DELETE)。
- 生产环境应关闭PHP错误显示,改用日志记录。






