根目录重写指规则作用于网站根路径(/)请求且须置于根目录.htaccess中,匹配模式不加开头斜杠,目标路径分绝对与相对,需先启用mod_rewrite、设allowoverride all并重启apache。

根目录重写不是指“把规则写在根目录”,而是指规则作用于网站根路径(/)下的请求,且规则本身需放在站点根目录的 .htaccess 文件中。关键在于:路径匹配不带开头斜杠、目标路径是否加斜杠要分清、必须确保环境已启用重写能力。
先让根目录支持重写
Apache 默认不读取 .htaccess 中的重写规则,必须显式放开权限:
- 打开
httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so - 找到对应站点根目录的
<directory></directory>块,把AllowOverride None改成AllowOverride All - 重启 Apache(
systemctl restart httpd或apachectl restart) - 在网站根目录新建
.htaccess,首行必须是:RewriteEngine On
根目录下 RewriteRule 的路径写法
在 .htaccess 中,所有匹配都是相对于当前目录(即根目录),模式开头不能加 /,否则永远不匹配:
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- ✅ 正确:
RewriteRule ^about\.html$ /about.php [L]→ 匹配https://example.com/about.html - ❌ 错误:
RewriteRule ^/about\.html$ /about.php [L]→ 开头斜杠多余,规则失效 - 目标路径用绝对路径(
/about.php)表示从网站根开始找;用相对路径(about.php)则按当前目录找 - 常见需求如首页映射:
RewriteRule ^$ /index.php [L](空路径即根)
典型根目录重写场景
不需要跳转、只做内部转发,浏览器地址栏不变:
- 伪静态文章页:
RewriteRule ^post/([0-9]+)/?$ /article.php?id=$1 [L,QSA,NC] - 隐藏 PHP 后缀:
RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^([^\.]+)$ $1.php [L] - 统一入口(如 Laravel):
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php [QSA,L]
调试与验证要点
写完别急着上线,重点看三件事:
- 访问
https://example.com/post/123,页面内容正常加载,地址栏仍是/post/123→ 说明是内部重写,成功 - 查看 Apache 错误日志(
logs/error_log),常见错误如bad flag delimiters多因标志缺方括号或空格不全 - 临时加
[R=302]测试匹配逻辑(避免 301 缓存干扰),确认后再去掉R改为纯内部重写










