我有一个 Apache 服务器,它为应用程序(而不是浏览器)提供二进制文件。
发出请求的应用程序需要 HEX 格式的 HTTP Content-MD5 标头。Apache 中的默认且唯一选项是 Base64。如果我将“ContentDigest on”添加到我的 VirtualHost,我会以 Base64 格式获得此标头。
所以我编写了一个 perl 脚本,md5digesthex.pl,它给了我我想要的东西:十六进制格式的 MD5,但我正在努力使用 RewriteRule 让我的服务器发送结果。
这是我当前的重写配方:
RewriteEngine on
RewriteMap md5inhex prg:/www/download/md5digesthex.pl
RewriteCond %{REQUEST_URI} ^/download/(.*)
RewriteRule ^(.*) %{REQUEST_URI} [E=HASH:${md5inhex:$1}]
Header set Content-MD5 "%{HASH}e" env=HASH
问题是我似乎无法根据 md5inhex 映射函数的输出设置 HASH 环境变量。似乎不支持此行为,我不知道如何制定此行为...
答案1
我认为更好的问题是,你为什么要重新定义RFC已经定义? 如果您尝试重载 Content-MD5 标头,则很可能只需使用不同的标头即可。如果您尝试将其适应您的程序,在我看来,您的程序做错了,应该予以纠正。
编辑:所以我在本地查看了这个问题。你能告诉我 md5digesthex.pl 的输出是什么吗?它应该是一对以空格分隔的值,即:
some/path/to/file somehash
听起来键/值可能不匹配,因为假设${md5inhex:$1}
执行正确,这将完成您想要的操作。为了进行测试,您可以尝试设置一个虚拟变量;即:
RewriteEngine on
RewriteMap md5inhex prg:/www/download/md5digesthex.pl
RewriteCond %{REQUEST_URI} ^/download/(.*)
RewriteRule ^(.*) %{REQUEST_URI} [E=HASH:${md5inhex:$1}]
Header set Content-MD5 "%{HASH}e" env=HASH
RewriteRule ^(.*)$ - [E=TEST_HASH:${md5inhex:somekey}]
Header set TestingHeader "%{TEST_HASH}e" env=TEST_HASH
您可以使用类似方法curl -I <server>/<path>
验证其是否已设置。我可以验证使用正确格式的 RewriteMap,这将正确设置您的信息。