Apache RewriteCond 可通过 %{HTTP_COOKIE} 变量匹配客户端 Cookie 实现无JS/后端的快速路由,支持登录态识别、A/B测试等;需注意 Cookie 格式、URL编码、空格分隔及多条件组合,并配合 [CO] 标志设置 Cookie。

Apache 的 RewriteCond 可以直接读取客户端请求头中的 Cookie 字段,从而判断用户是否携带特定 Cookie 值,再结合 RewriteRule 实现个性化页面跳转。这种方式不依赖 JavaScript 或后端逻辑,响应快、兼容性好,适合做登录态识别、A/B 测试分流、用户偏好路由等场景。
检测 Cookie 是否存在并匹配指定值
最常用的是用 %{HTTP_COOKIE} 变量配合正则表达式判断。注意 Cookie 字符串格式为 key1=val1; key2=val2; ...,中间有空格和分号,需谨慎写匹配模式。
- 检查是否存在名为
theme=dark的 Cookie(精确匹配):RewriteCond %{HTTP_COOKIE} theme=dark [NC] - 检查是否不包含
user_type=premium(常用于免费用户跳转):RewriteCond %{HTTP_COOKIE} !^.*user_type=premium.*$ [NC] - 提取 Cookie 中的用户 ID 并用于重定向(捕获组 + 后向引用):
RewriteCond %{HTTP_COOKIE} user_id=([0-9]+)RewriteRule ^/dashboard$ /dashboard-v2?uid=%1 [R=302,L]
结合多条件实现精准分流
单靠 Cookie 往往不够,通常要叠加其他上下文,比如 Host、路径、语言或设备类型,避免误判或循环跳转。
- 仅当访问
/且 Cookie 中有lang=ja,且当前域名不是ja.example.com时,跳转到日文站:RewriteCond %{HTTP_COOKIE} lang=ja [NC]RewriteCond %{HTTP_HOST} !^ja\.example\.com$ [NC]RewriteRule ^/$ https://ja.example.com/ [R=302,L] - 对移动端用户(通过 UA 判断)+ 已登录(有
auth_tokenCookie)者,跳转到新版 PWA 页面:RewriteCond %{HTTP_USER_AGENT} "iPhone|Android" [NC]RewriteCond %{HTTP_COOKIE} auth_token= [NC]RewriteRule ^/$ /pwa/ [R=302,L]
设置与验证 Cookie 的常见配合方式
重定向本身不发 Cookie,若需在跳转前设置或更新 Cookie,要用 [CO] 标志(即 cookie 标志),它必须和 RewriteRule 配合使用,且目标 URL 通常设为 -(不改路径)。
- 用户点击
?pref=mobile链接后,存 Cookie 并跳回首页:RewriteCond %{QUERY_STRING} pref=mobileRewriteRule ^ - [CO=pref:mobile:%{HTTP_HOST}:/ :604800:1]RewriteRule ^ /? [R=302,L] - 之后可用
RewriteCond %{HTTP_COOKIE} pref=mobile检测并重定向到/m/目录。
注意事项与排错要点
Cookie 检测容易因格式细节失败,务必注意以下几点:
-
%{HTTP_COOKIE}是原始字符串,不含解码,特殊字符(如空格、中文)会是 URL 编码形式(如%E4%BD%A0%E5%A5%BD),正则中要匹配编码后的内容,或改用后端处理更稳妥; - 多个 Cookie 条目之间可能有空格,推荐用
.*?或[^;]*而非硬写分号,例如:RewriteCond %{HTTP_COOKIE} (?:^|;\s*)theme=([^;]*)(?:;|$); - 本地测试时浏览器可能缓存 301 跳转,建议先用
R=302,确认逻辑无误后再改为R=301; - 确保
mod_rewrite已启用,且配置位置(httpd.conf或.htaccess)允许使用RewriteCond和[CO]等高级标志。


















