一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Apache RewriteRule 根目录重写如何写

时间:2026-08-06 14:01:55 编辑:袖梨 来源:一聚教程网

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

根目录重写不是指“把规则写在根目录”,而是指规则作用于 根路径(/)下的请求,且规则本身需放在站点根目录的 .htaccess 文件中。关键在于:路径匹配不带开头斜杠、目标路径是否加斜杠要分清、必须确保环境已启用重写能力。

先让根目录支持重写

Apache 默认不读取 .htaccess 中的重写规则,必须显式放开权限:

  1. 打开 httpd.conf,取消注释:LoadModule rewrite_module modules/mod_rewrite.so
  2. 找到对应站点根目录的 <Directory> 块,把 AllowOverride None 改成 AllowOverride All
  3. 重启 Apache(systemctl restart httpdapachectl restart
  4. 在 根目录新建 .htaccess,首行必须是:RewriteEngine On

根目录下 RewriteRule 的路径写法

.htaccess 中,所有匹配都是相对于当前目录(即根目录),模式开头不能加 /,否则永远不匹配:

  1. ✅ 正确:RewriteRule ^about.html$ /about.php [L] → 匹配 https://example.com/about.html
  2. ❌ 错误:RewriteRule ^/about.html$ /about.php [L] → 开头斜杠多余,规则失效
  3. 目标路径用绝对路径(/about.php)表示从 根开始找;用相对路径(about.php)则按当前目录找
  4. 常见需求如首页映射:RewriteRule ^$ /index.php [L](空路径即根)

典型根目录重写场景

不需要跳转、只做内部转发,浏览器地址栏不变:

  1. 伪静态文章页:RewriteRule ^post/([0-9]+)/?$ /article.php?id=$1 [L,QSA,NC]
  2. 隐藏 PHP 后缀:RewriteCond %{REQUEST_FILENAME} !-f

    RewriteRule ^([^.]+)$ $1.php [L]

  3. 统一入口(如 Laravel):RewriteCond %{REQUEST_FILENAME} !-f

    RewriteCond %{REQUEST_FILENAME} !-d

    RewriteRule ^(.*)$ /index.php [QSA,L]

调试与验证要点

写完别急着上线,重点看三件事:

  1. 访问 https://example.com/post/123,页面内容正常加载,地址栏仍是 /post/123 → 说明是内部重写,成功
  2. 查看 Apache 错误日志(logs/error_log),常见错误如 bad flag delimiters 多因标志缺方括号或空格不全
  3. 临时加 [R=302] 测试匹配逻辑(避免 301 缓存干扰),确认后再去掉 R 改为纯内部重写

热门栏目