apache mod_rewrite的核心功能是在请求抵达后端前轻量改道url,不改代码、不重启服务;需三步生效:启用模块并验证运行、授权.htaccess(allowoverride all)、编写含rewriteengine on和[l]等标志的规则,区分[r]重定向与内部重写。

Apache mod_rewrite 的核心功能不是“写正则”,而是把 URL 请求在抵达后端前悄悄改道——它不改代码、不重启服务,只在请求路径上做轻量干预。用对了,SEO 友好链接、旧页面兼容、敏感路径屏蔽、子域名跳转都能靠几行规则搞定。
启用模块并确认运行状态
模块没加载,规则全是摆设。不能只看配置文件里有没有那行 LoadModule,得验证它真在内存里跑着。
- Debian/Ubuntu 系统:执行 sudo a2enmod rewrite && sudo systemctl restart apache2
- RHEL/CentOS 系统:编辑 /etc/httpd/conf/httpd.conf,取消 LoadModule rewrite_module modules/mod_rewrite.so 前的注释
- 统一验证方式:apache2ctl -M | grep rewrite 或 httpd -M | grep rewrite,看到 rewrite_module (shared) 才算成功
授权 .htaccess 使用重写指令
即使模块开着,Apache 默认禁止目录级重写。没开权限,.htaccess 里的 RewriteRule 会被直接忽略。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 找到网站根目录对应的
块(通常在 apache2.conf 或虚拟主机配置里) - 把 AllowOverride None 改成 AllowOverride All
- 确保 Options 包含 FollowSymLinks(旧版 Apache 要求)
- 改完必须重启 Apache,否则不生效
写出可落地的第一条规则
别一上来就写复杂正则。先让最简路径跑通,再叠加逻辑。RewriteEngine On 是总开关,必须放在每组规则第一行;[L] 标志多数时候不能少,避免后续规则干扰。
- 在站点根目录建 .htaccess,首行写 RewriteEngine On
- 加测试规则:RewriteRule ^article/([0-9]+)\.html$ /article.php?id=$1 [NC,L]
- 访问 /article/123.html 应正常显示内容,地址栏不变,且响应头无 302 —— 这才是内部重写,不是跳转
- 注意:匹配路径不加开头斜杠(^article/... 不是 ^/article/...),这是 .htaccess 环境下的关键细节
区分重写与重定向的关键标志
一个字母之差,效果完全不同:内部重写不改浏览器地址,性能高;外部重定向会跳转,影响 SEO 和用户体验。
- [R] 或 [R=301]:强制 HTTP 重定向,地址栏会变,适合页面永久迁移
- [L]:当前规则结束,不再匹配后续规则(防止意外覆盖)
- [QSA]:保留原始 URL 中的查询参数,比如 /product/abc/2026?utm_source=ad 映射后仍带 utm_source
- [NC]:忽略大小写,避免因大小写不一致导致 404










