apache rewritecond 可通过 %{http_cookie} 匹配 cookie,需注意格式与正则逻辑:匹配键用 user_id=,精确匹配键值对应写为 (^|;\s*)user_id=123(;|$),并注意 url 编码、大小写及多条件组合。

Apache 的 RewriteCond 可以通过 %{HTTP_COOKIE} 变量匹配 Cookie,但要注意格式和匹配逻辑。
用 %{HTTP_COOKIE} 获取完整 Cookie 字符串
浏览器发送的 Cookie 会拼成一个字符串,形如:user_id=123; session=abc; theme=dark
所以直接匹配时需考虑键值对位置和分隔符(分号+空格)。
- 匹配存在某个 Cookie 键(不关心值):
RewriteCond %{HTTP_COOKIE} user_id= - 匹配特定键值对(更安全,避免子串误匹配):
RewriteCond %{HTTP_COOKIE} (^|;\s*)user_id=123(;|$) - 注意:正则中
^表示开头,$表示结尾,;\s*匹配分号及可选空格
常用写法示例
以下是在 .htaccess 或虚拟主机配置中实际可用的写法:
- 跳过登录页,当有有效 session 时重定向到后台:
RewriteCond %{HTTP_COOKIE} (^|;\s*)session=[^;]+(;|$)RewriteRule ^login\.php$ /admin/ [R=302,L] - 根据 theme Cookie 启用不同静态资源路径:
RewriteCond %{HTTP_COOKIE} (^|;\s*)theme=dark(;|$)RewriteRule ^(css|js)/(.*)$ /themes/dark/$1/$2 [L]
注意事项
Cookie 匹配容易出错,主要因为:
-
%{HTTP_COOKIE}不自动解码,如果 Cookie 值含 URL 编码(如name=%E4%BD%A0%E5%A5%BD),需用%{ENV:REDIRECT_STATUS}配合外部脚本,或改用 Lua/mod_lua 处理 - 大小写敏感,默认正则区分大小写;如需忽略,加
[NC]标志 - 多个条件组合时,用
[OR]显式声明逻辑或,否则默认是 AND - 调试建议:先用
RewriteLog(Apache 2.2)或LogLevel alert rewrite:trace3(2.4+)查看实际匹配值
替代方案:用环境变量简化判断
若逻辑复杂,可先提取 Cookie 值设为环境变量,再判断:
RewriteCond %{HTTP_COOKIE} (^|;\s*)lang=([^;]+)(;|$)RewriteRule .* - [E=LANG:%2]- 后续可用
%{ENV:LANG}引用,比如:RewriteCond %{ENV:LANG} ^zhRewriteRule ^index\.html$ /index_zh.html [L]











