php如何实现单一入口
单一入口的实现原理
单一入口(Single Entry Point)是一种设计模式,通过一个统一的入口文件(如index.php)处理所有请求,再根据参数分发到不同的模块或控制器。这种方式便于统一管理权限、日志、路由等。
基本实现步骤
创建入口文件index.php,通常放在项目根目录。通过解析URL或参数决定调用哪个模块。
// index.php
$action = $_GET['action'] ?? 'index';
$controller = $_GET['controller'] ?? 'home';
// 安全过滤
$controller = strtolower(preg_replace('/[^a-zA-Z0-9_]/', '', $controller));
$action = strtolower(preg_replace('/[^a-zA-Z0-9_]/', '', $action));
// 动态加载控制器类
$controllerClass = ucfirst($controller) . 'Controller';
if (file_exists("controllers/{$controllerClass}.php")) {
require_once "controllers/{$controllerClass}.php";
if (method_exists($controllerClass, $action)) {
(new $controllerClass())->$action();
} else {
header("HTTP/1.0 404 Not Found");
}
} else {
header("HTTP/1.0 404 Not Found");
}
URL重写配置
为了实现美观的URL(如/user/profile而非index.php?controller=user&action=profile),需配置服务器重写规则。
Apache配置(.htaccess):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
Nginx配置:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
路由解析优化
使用更灵活的路由解析方式,例如通过$_SERVER['REQUEST_URI']提取路径信息:
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segments = explode('/', trim($uri, '/'));
$controller = $segments[0] ?? 'home';
$action = $segments[1] ?? 'index';
自动加载与依赖管理
结合PSR-4自动加载规范,使用Composer管理类自动加载:

// composer.json
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
安全注意事项
- 对输入参数进行严格过滤,防止目录遍历或代码注入
- 限制可访问的控制器和动作白名单
- 使用
htmlspecialchars输出用户输入内容 - 考虑使用成熟的框架(如Laravel、Symfony)已实现的单一入口方案






