You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CodeIgniter结构的过程式PHP网站中实现路由功能?

实现过程式PHP网站的CodeIgniter风格路由

完全可以给你的过程式PHP网站实现类似CodeIgniter的简洁路由,核心思路是通过URL重写把所有请求导向统一入口文件,再在入口文件里手动解析URL并映射到对应的控制器文件和函数,下面是具体实现步骤:

1. 配置URL重写(.htaccess)

在网站根目录创建.htaccess文件,将所有非静态资源的请求转发到根目录的index.php(和CI的入口逻辑一致):

RewriteEngine On
# 排除实际存在的文件和目录(比如assets下的静态资源)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 将所有请求转发到index.php,保留URL路径
RewriteRule ^(.*)$ index.php/$1 [L]

2. 编写根目录入口文件index.php

这个文件是所有请求的统一入口,负责解析URL、加载对应控制器、调用目标函数:

<?php
// 定义全局路径常量,方便后续引用文件
define('BASEPATH', __DIR__ . '/');
define('APPPATH', BASEPATH . 'app/');

// 获取并清理URL路径
$uri = isset($_SERVER['REQUEST_URI']) ? trim($_SERVER['REQUEST_URI'], '/') : '';
// 拆分URL为分段(对应CI的URI分段)
$segments = explode('/', $uri);

// 设置默认路由规则(访问根目录时的默认控制器和方法)
$default_controller = 'home';
$default_method = 'index';

// 提取控制器、方法和参数
$controller = !empty($segments[0]) ? $segments[0] : $default_controller;
$method = !empty($segments[1]) ? $segments[1] : $default_method;
$params = array_slice($segments, 2);

// 构建控制器文件路径(对应app/controllers下的PHP文件)
$controller_file = APPPATH . 'controllers/' . $controller . '.php';

// 处理控制器不存在的情况
if (!file_exists($controller_file)) {
    include APPPATH . 'views/404.php';
    exit;
}

// 加载目标控制器文件
include $controller_file;

// 处理方法不存在的情况
if (!function_exists($method)) {
    include APPPATH . 'views/404.php';
    exit;
}

// 调用目标方法并传递参数
call_user_func_array($method, $params);
?>

3. 编写过程式控制器示例

在app/controllers/下创建控制器文件(比如home.php),里面写对应功能的函数:

<?php
// 按需加载辅助函数和库(和CI加载helper、library逻辑一致)
include APPPATH . 'helpers/url_helper.php';
include APPPATH . 'libraries/validation_lib.php';

// 默认方法:首页
function index() {
    // 加载视图文件
    include APPPATH . 'views/home/index.php';
}

// 关于页方法,支持传入参数
function about($name = '') {
    $data['visitor_name'] = $name ?: 'Guest';
    include APPPATH . 'views/home/about.php';
}
?>

4. 可选:自定义路由规则

如果需要像CI那样设置自定义路由(比如把/blog/123映射到article/detail/123),可以在入口文件的URL解析部分添加路由匹配逻辑:

// 在拆分URI分段之前添加这段代码
$routes = [
    // 正则匹配URL,映射到目标控制器/方法
    'blog/(\d+)' => 'article/detail/$1',
    'contact-us' => 'contact/index'
];

// 遍历匹配自定义路由
foreach ($routes as $pattern => $target) {
    if (preg_match("#^$pattern$#", $uri)) {
        $uri = preg_replace("#^$pattern$#", $target, $uri);
        $segments = explode('/', $uri);
        break;
    }
}

5. 静态资源兼容

因为.htaccess里已经排除了实际存在的文件和目录,所以assets、files目录下的静态资源(CSS、JS、图片等)会直接被访问,不会经过入口文件,和CI的行为一致。

内容的提问来源于stack exchange,提问作者Redhead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:10:38