2017-05-18 73 views
0

我要自己回答這個問題,因爲我碰到它並找不到一個Google結果來幫助,所以希望這可以節省一些未來的人一些時間。帶文本選項的RewriteMap總是返回沒有結果

在APACHE2.2,我有塑造這樣一個RewriteMap指令,重定向到URL如果一個特定的查詢字符串參數存在:

RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt" 

RewriteCond %{QUERY_STRING} (^|&)foo=([^&]+) [NC] 
RewriteCond ${redirect:%1} !^$ 
RewriteRule ^.*$ ${redirect:%1} [301,L] 

而且/etc/arbitrary1/arbitrary2/redirect.txt

foo http://hello.invalid/somepath/1 # 1 
bar http://hello.invalid/somepath/2 # 2 
baz http://hello.invalid/somepath/3 # 3 

問題我遇到過,無論我使用哪一個「foo,bar,baz」,${redirect:%1}指令都會返回空白(即「不匹配」)。這與redirect.txt的格式無關。請參閱以下我發現的內容。

回答

0

所以問題最終導致中間目錄/etc/arbitrary1www-data用戶沒有執行權限。這個花了很長時間才發現的原因是,顯然,根源發生在之後檢查文件存在。也就是說,如果我將RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/redirect.txt"更改爲RewriteMap redirect "txt:/etc/arbitrary1/arbitrary2/doesnotexist.txt",Apache將在重新啓動時發生錯誤,這表明在加載配置時它沒有任何問題,因此無法設置/etc/arbitrary1/arbitrary2/redirect.txt。因爲Apache在開始時發現它,所以我認爲它在執行期間也可以訪問它(這是一個糟糕的假設)。當我給/etc/arbitrary1一個匹配萬維網數據(與chown www-data:www-data /etc/arbitrary1chmod o+x /etc/arbitrary1)匹配的執行perm時,地圖工作正常。