環境変数のVAL引数をRewriteMap変数で置換するApache RewriteRule

環境変数のVAL引数をRewriteMap変数で置換するApache RewriteRule

アプリケーション (ブラウザではない) にバイナリ ファイルを提供する Apache サーバーがあります。

リクエストを行うアプリケーションは、HEX 形式の HTTP Content-MD5 ヘッダーを必要とします。Apache 内のデフォルトおよび唯一のオプションは Base64 です。VirtualHost に「ContentDigest on」を追加すると、このヘッダーは Base64 で取得されます。

そこで、私は Perl スクリプト md5digesthex.pl を作成しました。これはまさに私が求めていたもの、つまり HEX 形式の MD5 を提供してくれましたが、サーバーに結果を送信させるための RewriteRule に苦労しています。

これが私の現在の Rewrite レシピです:

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 を使用すると、情報が正しく設定されることが確認できます。

関連情報