
通过 apache 的 .htaccess 配置 rewriterule,可将子目录(如 /items/)下所有路径(如 /items/general)统一交由该目录下的 index.php 处理,实现前端路由或单页应用式 url 结构。
通过 apache 的 .htaccess 配置 rewriterule,可将子目录(如 /items/)下所有路径(如 /items/general)统一交由该目录下的 index.php 处理,实现前端路由或单页应用式 url 结构。
要在子目录(例如 items/)中让其自身的 index.php 全权接管该目录下所有请求(包括 /items/general、/items/api/list 等),关键在于:必须在 Web 根目录(DocumentRoot)的 .htaccess 中统一配置重写规则,而非仅在子目录内放置 .htaccess —— 因为 Apache 默认不递归启用子目录中的重写引擎,且子目录的 .htaccess 仅影响该目录下的直接访问路径,无法捕获上级路径匹配(如 items/general 实际由根目录解析,子目录 .htaccess 不生效)。
✅ 正确做法:在网站根目录(与主 index.php 同级)创建或编辑 .htaccess,添加如下规则:
RewriteEngine On # 将所有以 "items/" 开头的请求,重写到 items/index.php(保留原始 URI) RewriteRule ^items/(.*)$ items/index.php [L]
该规则含义:
- ^items/(.*)$ 匹配任意以 items/ 开头的路径(如 items/、items/general、items/api/v1/data);
- $1 捕获 items/ 后的全部路径(即 general、api/v1/data),但本例未显式传递——若需在 items/index.php 中获取原始路径,推荐使用 $_SERVER['REQUEST_URI'](值为 /items/general),或改用带 QUERY_STRING 传递的写法:
RewriteRule ^items/(.*)$ items/index.php?path=$1 [L,QSA]
此时在 items/index.php 中可通过 $_GET['path'] 获取 general。
立即学习“PHP免费学习笔记(深入)”;
⚠️ 注意事项:
- 确保 Apache 已启用 mod_rewrite,且服务器允许 .htaccess 覆盖(AllowOverride All 在虚拟主机配置中已设置);
- .htaccess 文件名必须是 .htaccess(不是 .htacces,原问题中拼写错误);
- 若有多个子目录需同样处理,可用泛化规则(谨慎使用,避免冲突):
# 匹配任意一级子目录(如 /blog/、/admin/),并重写到其 index.php
RewriteRule ^(\w+)/(.*)$ $1/index.php?path=$2 [L,QSA]
# 或仅匹配存在对应子目录的情况(更安全):
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(\w+)/(.*)$ $1/index.php?path=$2 [L,QSA]? 最佳实践:在 items/index.php 开头加入调试输出,验证是否成功接管:
<?php // items/index.php echo "<h2>✅ items/index.php 已接管请求</h2>"; echo "<p>原始请求 URI: " . htmlspecialchars($_SERVER['REQUEST_URI']) . "</p>"; echo "<p>PATH_INFO(若启用): " . (isset($_SERVER['PATH_INFO']) ? htmlspecialchars($_SERVER['PATH_INFO']) : 'N/A') . "</p>"; // 后续路由逻辑...
这样即可实现子目录级“单一入口”,为 PHP 微框架、静态资源代理或 SPA 后端路由打下基础。



















