apache中配置带条件的重写需启用mod_rewrite模块、设置allowoverride all,并用rewritecond(每条须前置对应rewriterule)与rewriterule组合实现,支持%{http_host}等变量、正则匹配及nc等标志。

在 Linux 的 Apache 中配置带条件的重写判断,核心是组合使用 RewriteCond(重写条件)和 RewriteRule(重写规则),并确保 mod_rewrite 已启用、.htaccess 或配置文件允许覆盖。
确认并启用 mod_rewrite 模块
Apache 默认可能未启用重写模块。需先启用:
- 执行
sudo a2enmod rewrite(Ubuntu/Debian 系统) - 或手动编辑
/etc/apache2/mods-enabled/rewrite.load,确保加载行未被注释:LoadModule rewrite_module modules/mod_rewrite.so - 重启服务:
sudo systemctl restart apache2
允许 .htaccess 使用重写规则
若通过 .htaccess 配置(推荐用于单站点灵活管理),必须让对应目录支持覆盖:
- 编辑虚拟主机配置(如
/etc/apache2/sites-available/000-default.conf)或主配置apache2.conf - 找到对应
<directory></directory>块(例如<directory></directory>) - 将
AllowOverride None改为AllowOverride All - 重启 Apache 生效
编写带条件的重写逻辑
条件判断靠 RewriteCond 实现,每条 RewriteCond 必须放在对应 RewriteRule 之前;只有所有前置条件都满足,该规则才执行。
- 常见判断场景示例:
- 仅当域名是
www.example.com时跳转:RewriteCond %{HTTP_HOST} ^www\.example\.com$ [NC]RewriteRule ^(.*)$ https://example.com/$1 [R=301,L] - 仅当请求路径不是真实文件或目录时,转发给前端路由(如 SPA):
RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ /index.html [L] - 同时满足多个条件(默认是 AND 关系);用
[OR]标志可改为 OR:RewriteCond %{HTTP_HOST} ^old1\.com$ [OR]RewriteCond %{HTTP_HOST} ^old2\.com$RewriteRule ^(.*)$ https://new.com/$1 [R=301,L]
关键语法与注意事项
条件中常用变量包括:%{HTTP_HOST}(主机名)、%{REQUEST_URI}(含开头斜杠的路径)、%{HTTPS}(是否 HTTPS)、%{QUERY_STRING}(查询参数)等。
- 正则表达式需转义点号:
\.,而非. -
[NC]表示不区分大小写,[L]表示终止后续规则匹配 - 条件中的反向引用用
%1、%2(来自RewriteCond的括号捕获),规则中用$1、$2(来自RewriteRule的捕获) - 服务器级配置(
httpd.conf)比.htaccess性能更好,但需 root 权限;.htaccess更灵活,适合无权限修改主配置的场景










