跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

php怎样实现简单路由_php实现简单路由规则匹配【路由】

PHP原生路由核心是解析$_SERVER['REQUEST_URI']获取路径并匹配处理函数:固定路径用switch最安全,动态参数用preg_match加^$锚定和1+限制,需Web服务器配置重写规则(如Nginx的try_files)才能生效。/ ↩ PHP 原生如何做基础 路由 匹配 不用框架也能实现 URL 到处理函数的映射,核心是读取
$_SERVER['REQUEST_URI']
,去掉查询参数和路径前缀后,用字符串或正则比对。关键不在“多强大”,而在“不依赖、可调试、易嵌入”。 用 switch 匹配固定路径最安全 适合后台管理页、API 端点等路径明确、变动少的场景。避免正则开销和歧义,也绕过重写配置问题。
if (isset($_SERVER['REQUEST_URI'])) { $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // 去掉可能的子目录前缀,如 /myapp/ $base = '/myapp'; // 根据实际部署路径调整 $route = $path === $base ? '/' : str_replace($base, '', $path); switch ($route) { case '/': echo '首页'; break; case '/about': echo '关于页'; break; case '/api/users': header('Content-Type: application/json'); echo json_encode(['users' => []]); break; default: http_response_code(404); echo '404 Not Found'; break; } }
$base
必须与实际 Web 服务器(Nginx/Apache)部署路径一致,否则
$route
会错位 注意
parse_url(..., PHP_URL_PATH)
才能剥离
?a=1&b=2
,直接用
$_SERVER['REQUEST_URI']
会把查询参数混进匹配 不要在
switch
前做
trim($path, '/')
—— 会导致
/user/123
和
/user/123/
被当成同一路径,而它们语义不同 用 preg_match 支持带参数的动态路由 当需要提取 ID、slug 等变量时,正则比
explode('/', ...)
更可控。但必须限制贪婪匹配范围,防止误吞斜杠。
$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); // 匹配 /post/123 或 /post/hello-world,不匹配 /post/123/edit if (preg_match('#^/post/([^/]+)$#', $path, $matches)) { $slug = $matches[1]; // 如 '123' 或 'hello-world' echo "展示文章:{$slug}"; } elseif (preg_match('#^/user/(\d+)$#', $path, $matches)) { $id = (int)$matches[1]; echo "用户ID:{$id}"; } else { http_response_code(404); echo '路由未定义'; }
正则开头必须用
^
,结尾必须用
$
,否则
/user/123/edit
也会命中
/user/(\d+)
捕获组用
([^/]+)
比
(.+)
安全,避免跨路径段匹配 数字 ID 强制转
(int)
,防止注入或意外类型行为 Apache/Nginx 下必须配置 URL 重写 否则访问
/about
会直接 404,Web 服务器根本不会把请求交给
index.php
处理。 PHP 8.5.5 PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。 下载 立即学习 “ PHP免费学习笔记(深入) ”; Apache:确保
.htaccess
启用且含
RewriteRule ^(.*)$ index.php [QSA,L]
Nginx:在 server 块中加
try_files $uri $uri/ /index.php?$query_string;
PHP 内置服务器(
php -S
)需手动指定 路由器 脚本:
php -S localhost:8000 router.php
,其中
router.php
返回要加载的文件路径 没配重写,所有动态路由都只是纸上谈兵。

相关文章