如何对Apache头部进行Base64编码?

4

我正在使用Apache作为前端HTTP代理。我需要将特定环境变量的值作为标题发送到所有代理请求中,就像这样:

RequestHeader set myheader %{FOO}e

问题在于环境变量FOO的值必须是Base64编码的。是否可能即时对标头值进行Base64编码?使用mod_rewrite?子请求?自定义模块?... 顺便说一下,该环境变量是由另一个Apache模块创建的,不幸的是我无法修复它。
2个回答

7

我明白了。可以使用mod_rewrite来读/写外部程序的标准输入和输出,像这样:

ProxyRequests on
RewriteEngine on

# 1 
RewriteMap base64map "prg:/bin/b64e" 

# 2
RewriteRule .* - [E=WIC:${base64map:%{QUERY_STRING}},NE]  

# 3
RequestHeader set x-b64encoded "%{ENV:WIC}e" 

# 4
RewriteRule ^proxy/.*$ http://localhost:9999 [P]
  1. 创建一个名为base64map的rewrite-map,该rewrite-map运行可执行文件(/bin/b64e),该文件从stdin读取并在stdout上编码。在apache启动时加载可执行文件,在循环中从stdin读取并通过/bin/base64进行传递,以使其正常工作。
  2. 重写规则将查询字符串(或其他任何内容)传递到名为base64map的映射中。输出用于将apache变量WIC设置为已编码值。
  3. 请求头x-b64encoded是从WIC中的值创建的,为了正确读取WIC变量,我们必须将语法更改为ENV:WIC。
  4. 最后,请求被代理到目标,并自动包含请求头。

5

使用带有base64 函数表达式也应该可以工作:

RequestHeader set myheader "expr=%{base64:%{FOO}e}"

以下是成功使用它对客户端证书执行额外的base64编码传递的方法:

RequestHeader set X-ENV-SSL_CLIENT_CERTIFICATE "expr=%{base64:%{SSL_CLIENT_CERT}s}"

更愿意使用以下代码: RequestHeader set myheader "expr=%{base64:env:FOO}" 但是它并不能正常工作。 - drzraf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接