mod_rewrite是apache用于动态修改请求url路径的模块,支持友好url映射、https强制、防盗链、spa统一入口等;需启用模块、设置allowoverride all、用rewriteengine on开启引擎,并通过rewriterule与rewritecond组合实现精准重写。

mod_rewrite 是 Apache 的一个强大模块,用于在请求到达服务器处理逻辑前,动态修改 URL 路径。它常用于实现友好的 URL(如 /article/123 → /article.php?id=123)、强制 HTTPS、阻止恶意访问、统一入口(如单页应用的 history 模式)等。
启用 mod_rewrite 并设置基础规则
确保 Apache 已加载该模块(通常默认启用),并在站点配置或 .htaccess 文件中开启重写引擎:
- 在虚拟主机配置或
.htaccess中添加:RewriteEngine On - 若使用
.htaccess,需确认对应目录的AllowOverride设置为All或至少包含FileInfo - 建议加上
RewriteBase /(根目录)或具体路径,避免相对路径解析错误
编写基本重写规则:RewriteRule 与 RewriteCond
RewriteRule 定义匹配和替换逻辑;RewriteCond 提供前置条件(如检查 HTTP 头、文件是否存在等)。
- 语法:
RewriteRule Pattern Substitution [Flags] - 例如将
/product/123映射到/product.php?id=123:RewriteRule ^product/([0-9]+)$ /product.php?id=$1 [L] - 常用标志:
[L]表示终止后续规则;[QSA]保留原始查询参数;[R=301]发起外部重定向 - 用
RewriteCond判断文件或目录不存在再重写(常用于 SPA):RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.html [L]
常见实用场景示例
无需硬编码,灵活应对典型需求:
-
强制 HTTPS + 去除 www:
RewriteCond %{HTTPS} off [OR]RewriteCond %{HTTP_HOST} ^www\. [NC]RewriteRule ^ https://example.com%{REQUEST_URI} [R=301,L,NE] -
隐藏 .php 扩展名:
RewriteCond %{REQUEST_FILENAME}.php -fRewriteRule ^(.+)$ $1.php [L]
(配合内部重写,浏览器地址栏仍显示/about) -
阻止特定用户代理或 IP:
RewriteCond %{HTTP_USER_AGENT} sqlmap [NC]RewriteRule ^ - [F](返回 403)
调试与注意事项
规则出错易导致 500 错误或无限重定向,调试很关键:
- 开启重写日志(仅开发环境):
RewriteLogLevel 3+RewriteLog "/path/to/rewrite.log"(Apache 2.2);2.4+ 改用LogLevel alert rewrite:trace3 - 始终测试正则表达式是否贪婪或漏匹配,比如
^.*$可能覆盖所有请求 - 避免循环:确保重写后的路径不再匹配原规则(用
[L]或更精确的 Pattern 控制) - 生产环境慎用
.htaccess,优先在虚拟主机配置中写规则,性能更好











