Apache mod_rewrite脚本编写本质是声明式配置,核心在于配对、验证与避坑;必须确保模块启用、AllowOverride All授权、RewriteEngine On开启三步到位,缺一规则即失效。

Apache mod_rewrite 脚本编写不是写独立程序,而是通过一组声明式指令(主要是 RewriteRule 和 RewriteCond)在配置文件中定义 URL 处理逻辑。核心目标是让请求路径按需映射、跳转或过滤,不依赖后端代码改动。关键不在“怎么写”,而在“怎么配对、怎么验证、怎么避坑”。
先确保三件基础事已到位
规则写得再准,缺一环就完全不生效:
- 模块已启用:运行
sudo a2enmod rewrite(Debian/Ubuntu)或取消httpd.conf中LoadModule rewrite_module的注释(CentOS/RHEL),再重启 Apache;用apache2ctl -M | grep rewrite确认输出含rewrite_module (shared) - .htaccess 权限放开:在虚拟主机或主配置的
<Directory>块中,把AllowOverride None改为AllowOverride All,并确保Options FollowSymLinks已启用 - 重写引擎开启:每个 .htaccess 或配置段开头必须有
RewriteEngine On,否则所有规则被忽略
从一条能跑通的规则开始写
别一上来就写复杂正则。先验证环境是否就绪:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在 .htaccess 中只保留两行:
RewriteEngine OnRewriteRule ^test$ /index.html [L] - 访问
/test,应显示首页内容(地址栏不变),说明内部重写成功 - 若返回 404,检查模块、权限、拼写;若跳转到
/index.html地址栏变,说明漏写了[L]或误加了[R]
常用场景对应的标准写法
按目的直接套用,注意标志含义:
-
伪静态(内部映射):把
/article/123指向article.php?id=123RewriteRule ^article/([0-9]+)$ /article.php?id=$1 [L,NC] -
永久重定向(SEO 迁移):把旧地址
/old.html301 跳转到新地址RewriteRule ^old\.html$ /new-page/ [R=301,L] -
单入口路由(如 PHP 框架):所有非真实文件/目录的请求都交给
index.phpRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.php [L] -
追加原始参数(QSA):当新 URL 需保留原查询串(如
?utm_source=ad)RewriteRule ^product/([^/]+)/([0-9]{4})$ /product.php?brand=$1&year=$2 [QSA,NC,L]
调试时盯住这两处
规则不生效?别猜,看证据:
-
查错误日志:Apache 2.4 用
LogLevel alert rewrite:trace3(写在虚拟主机配置里),然后看error_log中每步匹配过程;2.2 用RewriteLog+RewriteLogLevel -
用 curl 测试,不用浏览器:浏览器缓存重定向、JS 覆盖地址栏,干扰判断。执行
curl -I http://yoursite.com/test直接看响应头状态码和 Location - 临时删掉其他规则,只留一条最简的——排除顺序冲突或条件误判

















