2017-05-18 8 views
0

私はそれに遭遇し、助けになる単一のGoogleの結果を見つけることができなかったので、この質問に自己回答するつもりです。特定のクエリ文字列引数が存在する場合はApache2.2でテキストオプション付きRewriteMapは常に結果を返しません

、私はこのように作ら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ユーザーの実行権限がないという問題が発生しました。これが発見するまでに時間がかかった理由は、明らかに、ルートからのsuidがの後にファイルが存在するかどうかのチェックの後にが発生するためです。つまり、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にwww-data(chown www-data:www-data /etc/arbitrary1またはchmod o+x /etc/arbitrary1のいずれか)と一致する実行パーマネントを与えたとき、マップはうまくいきました。

関連する問題