通过 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,添加如下规则:
该规则含义:
^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 传递的写法:
此时在 items/index.php 中可通过 $_GET['path'] 获取 general。
立即学习
“
PHP免费学习笔记(深入)
”;
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
⚠️ 注意事项:
确保 Apache 已启用 mod_rewrite,且服务器允许 .htaccess 覆盖(AllowOverride All 在虚拟主机配置中已设置);
.htaccess 文件名必须是
.htaccess
(不是 .htacces,原问题中拼写错误);
若有多个子目录需同样处理,可用泛化规则(谨慎使用,避免冲突):
? 最佳实践:在 items/index.php 开头加入调试输出,验证是否成功接管:
这样即可实现子目录级“单一入口”,为 PHP 微框架、静态资源代理或 SPA 后端路由打下基础。
RewriteEngine On
# 将所有以 "items/" 开头的请求,重写到 items/index.php(保留原始 URI)
RewriteRule ^items/(.*)$ items/index.php [L]RewriteRule ^items/(.*)$ items/index.php?path=$1 [L,QSA]# 匹配任意一级子目录(如 /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 已接管请求";
echo "原始请求 URI: " . htmlspecialchars($_SERVER['REQUEST_URI']) . "
";
echo "PATH_INFO(若启用): " . (isset($_SERVER['PATH_INFO']) ? htmlspecialchars($_SERVER['PATH_INFO']) : 'N/A') . "
";
// 后续路由逻辑...