Apache配置:通过正则过滤替换请求头内容并返回为响应头
Apache 正则过滤请求头返回指定响应头配置
问题说明
- 需求:在Apache服务中对
group请求头做正则过滤,提取所有包含MYROLE的条目,拼接为逗号分隔的字符串后作为同名响应头返回 - 已知基础透传配置
Header echo ^group可正常运行,但直接在echo指令后追加正则参数的写法不生效,测试的失效配置如下:
Header echo group "%{HTTP:group}i m#/(?<=,)[^,]*MYROLE[^,]+(?=,)/#"
- 给定测试请求头示例:
group: OU=Groups Azure Virtual Desktop,OU=PROD,DC=prod,DC=test,DC=be:CN=(A) MYROLE - BO - TC BO Admin,OU=Groups XYZ Application Entitlements,OU=PROD,DC=prod,DC=test,DC=be:CN=(A) MYROLE - BO - ABO,OU=Groups XYZ Application Entitlements,OU=PROD,DC=prod,DC=test,DC=be:CN=(A) MYROLE - BO - TBO,OU=Groups XYZ Application Entitlements,OU=PROD,DC=prod,DC=test,DC=be:CN=(A) MYROLE - BO - B and C,OU=Groups XYZ Application Entitlements,OU=PROD,DC=prod,DC=test,DC=be:CN=(C) Adobe Fullstack Engineers
- 预期返回响应头:
group: DC=be:CN=(A) MYROLE - BO - TC BO Admin,DC=be:CN=(A) MYROLE - BO - ABO,DC=be:CN=(A) MYROLE - BO - TBO,CN=(A) MYROLE - BO - B and C
问题原因
Header echo指令本身只支持按头名称的正则匹配来回传整个头内容,不支持对头内部的字符串做正则提取或替换。另外最初写的正则/(?<=,)[^,]*MYROLE[^,]+(?=,)/gm存在边界缺陷:要求匹配内容前后必须有逗号,会漏掉请求头开头、末尾位置的MYROLE条目。
可行配置方案
方案一:Apache 2.4+ 原生mod_headers正则替换(配置最简)
确保服务器已加载mod_headers模块,直接在站点配置或.htaccess中写入如下规则:
<IfModule mod_headers.c> # 移除所有不包含MYROLE的逗号分隔分段 Header set group "%{HTTP:group}s" "expr=replace(%{HTTP:group}, '/(^|,)(?![^,]*MYROLE)[^,]+/g', '')" # 清除替换后开头可能残留的多余逗号 Header edit group "^," "" </IfModule>
方案二:mod_rewrite循环捕获(兼容更低版本Apache)
如果方案一的表达式在你的Apache版本中运行异常,可以用mod_rewrite循环提取所有匹配条目,兼容性更强:
<IfModule mod_rewrite.c> RewriteEngine On # 初始化存储匹配结果的环境变量 RewriteRule .* - [E=GROUP_MATCHES:] # 循环捕获非末尾位置的MYROLE分段 RewriteCond %{HTTP:group} ^([^,]*MYROLE[^,]*),(.*)$ [NC] RewriteRule .* - [E=GROUP_MATCHES:%{ENV:GROUP_MATCHES},%1,E=GROUP_REMAIN:%2] RewriteCond %{ENV:GROUP_REMAIN} ^([^,]*MYROLE[^,]*),(.*)$ [NC] RewriteRule .* - [E=GROUP_MATCHES:%{ENV:GROUP_MATCHES},%1,E=GROUP_REMAIN:%2] # 捕获末尾位置的MYROLE分段 RewriteCond %{ENV:GROUP_REMAIN} ^([^,]*MYROLE[^,]*)$ [NC] RewriteRule .* - [E=GROUP_MATCHES:%{ENV:GROUP_MATCHES},%1] # 拼接结果写入响应头,清除开头多余逗号 <IfModule mod_headers.c> Header set group "%{GROUP_MATCHES}e" "expr=replace(%{GROUP_MATCHES}e, '^,', '')" </IfModule> </IfModule>
注:如果请求头中MYROLE条目数量超过2个,可按相同规则多写几行循环捕获的RewriteCond、RewriteRule即可,数量匹配实际业务场景下的最大条目数就行。
两种配置都可以实现预期的过滤效果,配置完成后重载Apache服务即可生效。
内容的提问来源于stack exchange,提问作者Manish Chandra Kumar
相关产品推荐
相关产品推荐

