
我有一個 Apache 伺服器,它向應用程式(而不是瀏覽器)提供二進位檔案。
發出請求的應用程式需要十六進位格式的 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}
正確執行,這將執行您想要的操作。為了進行測試,您可以嘗試設定一個虛擬變數; IE:
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,這將正確設定您的資訊。