根目录重写指规则作用于 根路径(/)请求且须置于根目录.htaccess中,匹配模式不加开头斜杠,目标路径分绝对与相对,需先启用mod_rewrite、设AllowOverride All并重启Apache。
根目录重写不是指“把规则写在根目录”,而是指规则作用于 根路径(/)下的请求,且规则本身需放在站点根目录的 .htaccess 文件中。关键在于:路径匹配不带开头斜杠、目标路径是否加斜杠要分清、必须确保环境已启用重写能力。
Apache 默认不读取 .htaccess 中的重写规则,必须显式放开权限:
httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so
<Directory> 块,把 AllowOverride None 改成 AllowOverride All
systemctl restart httpd 或 apachectl restart).htaccess,首行必须是:RewriteEngine On
在 .htaccess 中,所有匹配都是相对于当前目录(即根目录),模式开头不能加 /,否则永远不匹配:
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]
RewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^([^.]+)$ $1.php [L]
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php [QSA,L]
写完别急着上线,重点看三件事:
https://example.com/post/123,页面内容正常加载,地址栏仍是 /post/123 → 说明是内部重写,成功logs/error_log),常见错误如 bad flag delimiters 多因标志缺方括号或空格不全[R=302] 测试匹配逻辑(避免 301 缓存干扰),确认后再去掉 R 改为纯内部重写