Apache RewriteRule动态重写核心是将带参数URL(如/product.php?id=123&cat=shoes)内部映射为干净路径(如/product/123/shoes),不改变浏览器地址栏;需确保mod_rewrite启用、AllowOverride All配置正确,并使用^product/(\d+)/(1+)/?$匹配、$1/$2引用、[L,QSA,NC]标志精准控制。/ ↩

Apache 的 RewriteRule 动态重写,核心是把带参数的请求(比如 /product.php?id=123&cat=shoes)映射成干净路径(比如 /product/123/shoes),同时让服务器内部悄悄处理,不改变浏览器地址栏——这才是真正的“动态重写”,不是跳转。
关键不在写得多,而在匹配准、替换对、标志稳。
✅ 先确保环境就绪
规则写得再好,环境没通也白搭:
确认
mod_rewrite已启用:
在httpd.conf中取消注释这一行:LoadModule rewrite_module modules/mod_rewrite.so允许
.htaccess覆盖重写权限:
找到对应网站目录的<directory></directory>块,把AllowOverride None改成AllowOverride All重启 Apache:
sudo systemctl restart httpd或sudo apachectl restart在站点根目录新建
.htaccess,首行必须是:RewriteEngine On
✅ 动态参数 → 友好路径(典型场景)
比如想把 /article.php?id=456&title=my-post 变成 /article/456/my-post,并让服务器内部调用 article.php 处理:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteRule ^article/([0-9]+)/([^/]+)/?$ /article.php?id=$1&title=$2 [L,QSA,NC]
说明:
-
^article/([0-9]+)/([^/]+)/?$:匹配以article/数字/文字开头的路径 -
([0-9]+)捕获 ID,用$1引用;([^/]+)捕获不含斜杠的标题,用$2引用 -
[L]表示匹配后停止后续规则;[QSA]保留原始 URL 中可能带的其他参数(如?utm_source=xxx);[NC]忽略大小写
⚠️ 注意:.htaccess 中的模式不加开头 /,因为上下文已剥离了目录前缀。写成 ^/article/... 是错的。
✅ 后端脚本统一入口(如 index.php 路由)
很多现代 PHP 框架或 CMS(如 ThinkPHP、WordPress)用单一入口,所有请求都落到 index.php,再由它解析路径:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?_url=/$1 [QSA,L]说明:
-
RewriteCond先判断:请求的不是真实文件(!-f),也不是真实目录(!-d) - 才执行
RewriteRule,把整个路径作为_url参数传给index.php -
[QSA]确保原始查询参数(如?ref=abc)不丢失
这个组合几乎适用于所有基于路由的 PHP 应用。
✅ 常见陷阱与避坑提示
-
无限循环:如果重写目标又触发同一条规则(比如重写到
index.php,而index.php又被规则再次匹配),加[L]和合理RewriteCond可避免 -
404 却无报错:检查
AllowOverride All是否生效,以及.htaccess是否在正确目录 -
地址栏变了:你用了
[R]标志(重定向),而不是纯内部重写。动态重写不该带[R] -
中文或特殊字符乱码:URL 中的 UTF-8 路径通常无需额外处理,但确保 PHP 脚本接收时用
urldecode()解码$1等变量 -
测试别只靠浏览器:清缓存,或用
curl -I http://yoursite.com/product/789看响应头是否为200而非301/302
不复杂但容易忽略。

















