Apache外部重定向需用RewriteCond判断条件(如域名、语言)后接带[R]标志的RewriteRule,返回301/302使浏览器地址栏变化;多条件默认“且”,用[OR]实现“或”;须加守卫条件防循环跳转,优先测试[R=302]。

Apache 中用 RewriteCond 配合 RewriteRule 实现外部重定向,核心是先判断条件(如域名、语言、路径等),再触发带 [R] 标志的跳转。不是所有重定向都需要 RewriteCond,但涉及逻辑判断时必须用它来过滤。
外部重定向的基本写法
外部重定向意味着浏览器地址栏会变化,返回 HTTP 301 或 302 状态码。关键点:
-
RewriteRule必须带[R]或[R=301]等标记,否则只是内部重写(URL 不变) -
RewriteCond放在RewriteRule前,用于限定该跳转只在满足条件时发生 - 多个条件默认是“且”关系;要用“或”,得加
[OR]标志
常见场景示例
把非 www 域名统一跳到 www 版本
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [R=301,L]说明:当访问的 Host 不是 www.example.com(不区分大小写),就 301 跳转到带 www 的地址,$1 保留原路径。
根据 Accept-Language 重定向中文用户
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
RewriteEngine On
RewriteCond %{HTTP:Accept-Language} ^zh [NC,OR]
RewriteCond %{HTTP:Accept-Language} ,zh- [NC]
RewriteCond %{HTTP_HOST} !^zh\.example\.com$ [NC]
RewriteRule ^(.*)$ https://zh.example.com/$1 [R=302,L]说明:匹配请求头中语言以 zh 开头,或含 ,zh-(如 en-US,zh-CN),且当前域名不是目标域名,才跳转。调试建议先用 302,上线再改 301。
注意避免循环跳转
如果条件没排除目标地址,容易造成无限重定向(浏览器报 ERR_TOO_MANY_REDIRECTS):
- 务必加类似
RewriteCond %{HTTP_HOST} !^目标域名$ [NC]的守卫条件 - 用
[L]结束规则链,防止后续规则干扰 - 测试时优先用
[R=302],确认行为正确后再换[R=301]
常用 RewriteCond 变量和写法
这些变量常用于判断依据:
-
%{HTTP_HOST}:客户端请求的域名(如example.com) -
%{REQUEST_URI}:请求的路径部分(如/old-page.html) -
%{HTTP:Accept-Language}:浏览器语言偏好(注意不是%{HTTP_ACCEPT_LANGUAGE}) -
%{REQUEST_FILENAME}:服务器上对应的真实文件/目录路径 -
%{HTTPS}:值为on或off,可用于强制 HTTPS
匹配符号:^ 表示开头,$ 表示结尾,! 表示取反,[NC] 表示忽略大小写。

















