少し前からApache2.4に上げたんだけれど,制限していたはずの海外からのコメントスパムがちらほら入るように。Apache2.2から引き継いだ設定が上手く機能していなかったようで。
Apache2.2の時はこんな風に記述してました。
<Directory "/home/*/public_html"> Order deny,allow Deny from all <LimitExcept POST PUT DELETE> Allow from all </LimitExcept> <Limit POST> Allow from 127.0.0.1 Include iplist_jp_allow </Limit> </Directory>
で,これをApache2.4に移行させるのに,こんなふうに書き直してみたら海外からもPOST書き放題に。
<Directory "/home/*/public_html"> Requrie all denied <LimitExcept POST PUT DELETE> Requrie all granted </LimitExcept> <Limit POST> Require ip 127.0.0.1 Include iplist_jp_allow </Limit> </Directory>
LimitExceptのとこのAllow from allをRequie all grantedって書いちゃったのがそもそもの間違い。ここにRequie all grantedって書くと,最初のRequire all deniedが上書きされるっぽくて,結果的にすべて許可状態になってしまいました。
(試してないけど,<RequireAll/Any/None>あたりで括る必要があったのかも?)
じゃぁRequire allなのかというと文法エラー。ウチの力ではAllow from allにあたる設定を見つけることが出来ませんでした。Require all deniedに許可条件を追加していくのに,Allow from allみたいなちゃぶ台返しは危険だから止めましょうってことなのかな?
そんなわけで思案した結果,Apache2.4の文法に倣い,1から書き直すことに。で,Apache2.4の今風?に書き換えた結果がこちら。
<Directory "/home/*/public_html"> Require all denied <RequireAny> <RequireAll> Require all granted Require not method POST PUT DELETE </RequireAll> <RequireAll> Require method POST <RequireAny> Require ip 127.0.0.1 Include iplist_jp_allow </RequireAny> </RequireAll> </RequireAny> </Directory>
最初のRequie all deniedはいらんかも。いまいちall grantedとall deniedの振る舞いが理解仕切れない。
<RequireAll/Any/None>はApache2.4の新しいディレクティブ。入れ子構造にもできて,記述としては分かりやすい…んだけど,実際書いた物を読み直すと微妙。2.4的にはこちらで書き換えること推奨なのかなぁ。
内容としては,<RequireAny>に許可する条件をリストアップ。一つ一つの条件は<RequireAll>で括った中身がすべて合致したとき。一つ目の条件のRequire all grantedは,Require not xxxxを指定するときは合致しなかった時の条件として必要とか。二つ目はRequire xxxなので,それだけで条件を満たすからRequire all xxxは要らんらしい。IPアドレスは列挙するので,どれかに合致で良いからまたRequireAnyで括る。
今までLimit/LimitExceptが無くなってすっきりしたような,余計にややこしくなったような…。