原生php实现路由
原生PHP实现路由的方法
在原生PHP中实现路由功能可以通过解析URL路径并匹配对应的处理逻辑来完成。以下是几种常见的方法:
使用$_SERVER['REQUEST_URI']解析路径
通过$_SERVER['REQUEST_URI']获取当前请求的URI,解析路径并匹配对应的控制器或函数:
$request = $_SERVER['REQUEST_URI'];
switch ($request) {
case '/':
require 'home.php';
break;
case '/about':
require 'about.php';
break;
default:
http_response_code(404);
require '404.php';
break;
}
动态路由参数解析
如果需要支持动态路由参数(如/user/123),可以通过正则表达式或字符串分割解析:
$uri = trim(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH), '/');
$parts = explode('/', $uri);
if ($parts[0] === 'user' && isset($parts[1])) {
$userId = $parts[1];
require 'user_profile.php';
} else {
http_response_code(404);
require '404.php';
}
使用.htaccess实现URL重写
结合Apache的.htaccess文件,将所有请求重定向到单一入口文件(如index.php):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]
然后在index.php中解析$_GET['url']实现路由:
$url = isset($_GET['url']) ? $_GET['url'] : 'home';
$url = rtrim($url, '/');
$url = explode('/', $url);
// 根据$url数组匹配路由
封装简单的路由类
可以封装一个简单的路由类,支持更灵活的路由定义:
class Router {
private $routes = [];
public function addRoute($path, $handler) {
$this->routes[$path] = $handler;
}
public function dispatch() {
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if (array_key_exists($path, $this->routes)) {
call_user_func($this->routes[$path]);
} else {
header("HTTP/1.0 404 Not Found");
echo '404 Not Found';
}
}
}
// 使用示例
$router = new Router();
$router->addRoute('/', function() { include 'home.php'; });
$router->addRoute('/about', function() { include 'about.php'; });
$router->dispatch();
支持HTTP方法的路由
如果需要区分GET、POST等HTTP方法,可以扩展路由逻辑:
$method = $_SERVER['REQUEST_METHOD'];
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
if ($method === 'GET' && $path === '/users') {
// 处理GET /users
} elseif ($method === 'POST' && $path === '/users') {
// 处理POST /users
}
注意事项
- 路由解析时需注意安全性,避免路径遍历攻击。
- 对于复杂的项目,建议使用成熟的框架(如Laravel、Symfony)内置的路由功能。
- 动态路由参数需验证和过滤,防止SQL注入等问题。
- 生产环境建议结合缓存机制提升路由匹配性能。







