
通过 apache 的 rewriterule 将子目录(如 /items/)下的所有请求统一交由其内部 index.php 处理,可实现路由接管、前端控制器模式及单页应用支持。
通过 apache 的 rewriterule 将子目录(如 /items/)下的所有请求统一交由其内部 index.php 处理,可实现路由接管、前端控制器模式及单页应用支持。
在标准 Web 服务器结构中,根目录的 index.php 是默认入口,但当项目模块化部署(如 /items/ 作为独立功能区)时,常需让该子目录下的 index.php 承担其路径下全部请求的调度职责——包括 /items/general、/items/edit/123 等非真实存在的路径。这本质上是启用「子目录级前端控制器(Front Controller)」模式。
关键在于正确配置 .htaccess 文件。你原尝试的规则:
RewriteEngine On RewriteRule ^/?$ items/index.php [L]
仅匹配空路径(即 /items/ 或 /items),而 ^/?$ 实际等价于“根路径或空路径”,并未覆盖 /items/general 这类带路径段的请求,因此导致 404。
✅ 正确做法是在 根目录的 .htaccess(而非 /items/.htaccess)中添加如下规则:
RewriteEngine On
# 将所有以 "/items/" 开头的请求,重写至 items/index.php(保留原始 URI)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^items/(.*)$ items/index.php [L]
? 注意事项:
- ✅ 必须放在网站根目录的 .htaccess 中(Apache 默认只读取当前目录及祖先目录的 .htaccess,子目录中的规则不向上生效);
- ✅ 使用 RewriteCond 排除真实存在的文件(如 /items/style.css)和目录,避免干扰静态资源;
- ✅ $1 捕获路径(如 general、edit/123),可在 items/index.php 中通过 $_SERVER['REQUEST_URI'] 或自定义方式获取并解析路由;
- ❌ 不要写成 RewriteRule items/ items/index.php [L](无锚定、无捕获,易误匹配);也不推荐泛用 (\w+)/ 规则(存在安全与兼容风险,如匹配 admin/ 可能绕过权限控制)。
? 在 items/index.php 中,建议主动解析原始请求路径以便路由分发:
<?php // items/index.php
$requestPath = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
// 去除前缀 "/items"
$route = ltrim(str_replace('/items', '', $requestPath), '/');
// $route 现在是 "general" 或 "edit/123",可用于 switch 或路由匹配
echo "<h1>Handled by items/index.php — route: '$route'";
总结:子目录入口接管依赖精准的 RewriteRule + 合理的条件判断,并需确保配置位置正确。这是构建模块化 PHP 应用(如微服务式目录结构、CMS 插件子站)的基础能力。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











