apache url重写通过.htaccess与mod_rewrite将静态路径映射为动态脚本,需启用模块、设置allowoverride all并重启服务;基础规则如^product/(\d+)/?$→product.php?id=$1;多段路径如^blog/([a-z-]+)/(\d{4})/?$→post.php?slug=$1&year=$2;须加rewritecond防循环及文件冲突。

Apache URL 重写把动态路径转成静态样式,核心是用 .htaccess 文件配合 mod_rewrite 模块做内部映射——浏览器看到的是干净的路径(如 /article/123),服务器实际调用的还是动态脚本(如 article.php?id=123),整个过程对用户透明。
确保 mod_rewrite 已启用并允许 .htaccess 覆盖
这是前提,缺一不可:
- 检查 Apache 是否加载了
rewrite_module:运行a2enmod rewrite(Linux)或确认httpd.conf中LoadModule rewrite_module modules/mod_rewrite.so已取消注释 - 在虚拟主机配置中设置
AllowOverride All,否则.htaccess文件里的规则不会生效 - 重启 Apache 使配置生效:
systemctl restart apache2或apachectl restart
编写基础重写规则(单参数场景)
例如将 /product/456 映射到 product.php?id=456:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在网站根目录创建或编辑
.htaccess文件 - 第一行必须写
RewriteEngine On - 添加规则:
RewriteRule ^product/([0-9]+)/?$ product.php?id=$1 [L] -
^product/([0-9]+)/?$匹配路径开头为/product/数字(可选结尾斜杠) -
$1是正则捕获的数字,直接传给product.php的id参数 -
[L]表示匹配后停止后续规则处理,避免冲突
处理多段路径与多个参数
比如把 /blog/php-tips/2026/ 解析为 post.php?slug=php-tips&year=2026:
- 规则写法:
RewriteRule ^blog/([a-z\-]+)/([0-9]{4})/?$ post.php?slug=$1&year=$2 [L] -
[a-z\-]+允许小写字母和连字符(适配英文标题),[0-9]{4}精确匹配四位数字年份 - 注意
&在规则中要写成&,否则会被解析为 HTML 实体 - 若需忽略大小写,加上
NC标志:[L,NC]
避免循环重定向和文件冲突
真实环境中常因规则太宽泛导致问题,建议加保护条件:
- 排除真实存在的文件和目录:
RewriteCond %{REQUEST_FILENAME} !-f和RewriteCond %{REQUEST_FILENAME} !-d - 放在
RewriteRule前面,这样访问/images/logo.png或/css/style.css不会误触发重写 - 如果项目用单一入口(如所有请求走
index.php),常用组合:RewriteCond %{REQUEST_FILENAME} !-f+RewriteCond %{REQUEST_FILENAME} !-d+RewriteRule ^(.*)$ index.php [QSA,L]










