在Linux的Apache中配置基于请求头的重写转发,需启用mod_rewrite模块、设置AllowOverride、用RewriteCond匹配HTTP头(如User-Agent、Referer、X-Client-Type等),再通过RewriteRule实现内部转发、重定向或拒绝访问,并注意规则顺序与标志位选择。

在 Linux 的 Apache 中配置基于请求头的重写转发,核心是用 RewriteCond 检查 HTTP 请求头(如 User-Agent、Referer、X-Forwarded-For 或自定义头),再配合 RewriteRule 执行内部转发或跳转。这不是单纯匹配路径,而是让规则“看人下菜”——根据客户端发来的头信息动态决策。
确认环境支持并启用必要模块
确保以下三点已就绪,否则条件判断无效:
-
mod_rewrite已加载:检查httpd.conf或apache2.conf中有LoadModule rewrite_module modules/mod_rewrite.so(取消注释) - 目录允许条件指令:对应
<directory></directory>块中设为AllowOverride All(或至少AllowOverride FileInfo) - 若用
.htaccess,需重启 Apache:sudo systemctl restart apache2(Debian/Ubuntu)或sudo systemctl restart httpd(RHEL/CentOS)
用 RewriteCond 匹配常见请求头
RewriteCond 的语法是:RewriteCond %{HTTP:HeaderName} pattern。注意大小写不敏感,但 HeaderName 首字母大写更稳妥。
- 匹配特定 User-Agent(如屏蔽爬虫):
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Firefox$ [NC]
或更常用:RewriteCond %{HTTP_USER_AGENT} bot|crawl|spider [NC] - 匹配 Referer 来源(防盗链):
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain\.com [NC]RewriteRule \.(jpg|png|gif)$ - [F] - 读取自定义头(如 API 网关透传的
X-Client-Type):RewriteCond %{HTTP:X-Client-Type} ^mobile$ [NC]RewriteRule ^api/(.*)$ /mobile-api/$1 [L,QSA] - 检查是否携带某头(存在即匹配):
RewriteCond %{HTTP:Authorization} ^(.+)$
可用于保护需认证的接口
转发行为选择:内部重写 vs 外部重定向
根据需求选对标志,避免误用导致数据丢失或暴露路径:
- 要内部转发(地址栏不变、POST 数据保留):
用[L,QSA],目标路径写成服务器内路径(如/newhandler.php) - 要强制跳转(如非移动端访问跳转到桌面版):
加[R=302,L]或[R=301,L],目标写完整 URL 或相对路径 - 禁止访问(返回 403):
[F,L],适合拦截恶意头或未授权访问 - 设置环境变量供后端读取:
[E=CLIENT_TYPE:mobile,L],PHP 中可用$_SERVER['REDIRECT_CLIENT_TYPE']获取
一个完整示例:按设备类型分流 API 请求
假设前端通过 X-Device 头声明设备类型,希望将 /v1/data 请求按头值分发到不同后端脚本:
RewriteEngine On
RewriteCond %{HTTP:X-Device} ^ios$ [NC]
RewriteRule ^v1/data$ /api/ios-handler.php [L,QSA]
<p>RewriteCond %{HTTP:X-Device} ^android$ [NC]
RewriteRule ^v1/data$ /api/android-handler.php [L,QSA]</p><p>RewriteCond %{HTTP:X-Device} ^web$ [NC]
RewriteRule ^v1/data$ /api/web-handler.php [L,QSA]</p><h1>默认兜底(头不存在或不匹配时)</h1><p>RewriteRule ^v1/data$ /api/fallback.php [L,QSA]
</p>
注意规则顺序:Apache 自上而下匹配,[L] 表示终止当前轮次,后续规则不再执行;无匹配则继续向下。










