Apache通过RewriteRule用正则匹配“好看路径”并内部映射到真实脚本,URL不变、利于SEO;需启用mod_rewrite、配置AllowOverride、.htaccess首行启用引擎;示例规则将/article/123映射为article.php?id=123,并支持多格式参数与常见陷阱规避。
apache 通过 rewriterule 实现动态 url 转静态 url,本质是用正则表达式匹配用户请求的“好看路径”,再内部映射回真实的 php/脚本文件和参数,浏览器地址栏不变、用户无感,但 url 更简洁、利于 seo。
确保基础环境就绪
这一步常被跳过,但出问题八成卡在这儿:
-
mod_rewrite 模块必须启用:检查 Apache 的
httpd.conf中这行是否取消注释:LoadModule rewrite_module modules/mod_rewrite.so -
.htaccess 生效权限要开:对应网站目录的
<Directory>块中,AllowOverride至少设为FileInfo(推荐All) -
根目录下要有 .htaccess 文件,且第一行必须是
RewriteEngine On,否则所有规则都不执行
写一条能用的 RewriteRule
以把 /article/123 映射到 article.php?id=123 为例:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteRule ^article/([0-9]+)/?$ article.php?id=$1 [L,QSA]
-
^article/([0-9]+)/?$:匹配以article/开头、后跟一个或多个数字、结尾可选斜杠的路径;([0-9]+)是捕获组,值会传给$1 -
article.php?id=$1:真实执行的脚本,$1就是刚才捕获的数字 -
[L]表示“匹配成功就停止后续规则”,避免冲突;[QSA]表示保留原始 URL 中可能带的其他参数(比如/article/123?ref=abc→article.php?id=123&ref=abc)
处理带字母或符号的参数(如产品名、游戏名)
动态页常含中文拼音、短横线、斜杠等,正则要更宽松:
- 匹配
/game/Final-Fantasy-XIV/→game.php?games=Final-Fantasy-XIV:RewriteRule ^game/([^/]+)/?$ game.php?games=$1 [L,NC]
说明:[^/]+表示“除斜杠外的任意字符至少一次”,比.*更安全;[NC]忽略大小写 - 匹配
/health-institution-cardiology-mycity→search.php?city=mycity&speciality=cardiology:RewriteRule ^health-institution-([a-z]+)-([a-z]+)$ search.php?speciality=$1&city=$2 [L]
注意:两个括号分别捕获专业名和城市名,顺序按实际需求调整
避免常见陷阱
很多重写失败不是规则写错,而是逻辑没理清:
-
不要在 RewriteRule 中写完整 URL:Pattern 只匹配路径部分(不含域名、协议、查询字符串),Substitution 也只写相对路径或文件名,别加
https://或/var/www/... -
区分内部重写和外部跳转:没有
[R]标志就是内部映射(URL 不变);加了[R=301]才是真实跳转(地址栏会变),伪静态不需要跳转 -
优先排除真实文件和目录:常在规则前加两行,防止把
/css/style.css也误匹配:RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d

















