子目录重写需先确保mod_rewrite启用、allowoverride all配置到位且apache重启;.htaccess中模式不加开头斜杠,rewritebase用于url与物理路径不一致时指定基准前缀。

子目录重写不是简单加个路径前缀,关键在于理解 .htaccess 的上下文剥离机制——它自动去掉当前目录的 URL 前缀,模式里不能带开头斜杠。
子目录重写的前提:环境必须配对
规则写得再准,环境没到位也白搭:
- 主配置中已启用模块:
LoadModule rewrite_module modules/mod_rewrite.so(取消注释) - 对应子目录的
<directory></directory>区块设为AllowOverride All - 子目录下有
.htaccess文件,且首行是RewriteEngine On - Apache 已重启(
systemctl restart httpd或apachectl restart)
子目录重写的核心写法:模式不加 /,目标路径看层级
假设网站根目录为 /var/www/html,你要配置的子目录是 /blog/(即访问 https://example.com/blog/),那么:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
.htaccess放在/var/www/html/blog/.htaccess - 所有
RewriteRule的模式只匹配/blog/后面的部分,比如请求/blog/post/123,模式应写^post/([0-9]+)$,不是^/blog/post/([0-9]+)$ - 目标路径若指向同级脚本(如
post.php),写成/blog/post.php?id=$1;若指向根目录脚本(如/index.php),写成/index.php?section=blog&id=$1
需要 RewriteBase 的典型场景
当子目录 URL 和物理路径不一致时(例如用软链接、别名或虚拟路径),浏览器看到的是 /news/,但实际文件在 /var/www/html/blog/,这时必须显式声明基准:
- 在
/var/www/html/blog/.htaccess开头添加:RewriteBase /blog/ - 之后的规则目标可写相对路径,比如
RewriteRule ^article/(.+)$ article.php?slug=$1 [L],引擎会自动补上前缀/blog/ - 没有
RewriteBase时,目标路径若写成article.php,服务器会按根目录去找,容易 404
常见错误与验证方式
写完别急着刷浏览器,缓存和重定向残留容易误判:
- 模式以
^/开头(如^/post/...)→ 永远不匹配,因为.htaccess上下文已剥离/blog/ - 目标路径漏写
/blog/前缀,又没设RewriteBase→ 找不到脚本,返回 404 - 用
curl -I https://example.com/blog/post/123查响应头:状态码应为200,且无Location:字段(说明是内部重写,不是跳转) - 开启 Apache 重写日志(
RewriteLogLevel 3+RewriteLog "/path/to/log")可逐行跟踪匹配过程(仅开发环境启用)










