以前 本番サーバにチェックアウトしちゃダメですか? - miauの避難所 で
とか書いたんですけど、具体的な方法を書いてませんでした。今回ちょっといじる機会があったのでまとめておきます。
Apache 2.2.3 で動作確認しています。
1. DirectoryMatch
mod_access でアクセス制限をかける方法。Subversion の FAQ に載っている方法もこちらです。
# <Directory ~ "/\.svn/">〜</Directory> でも可 <DirectoryMatch "/\.svn/"> Order deny,allow Deny from all </DirectoryMatch>
FAQ の例は "^/.*/\.svn/" になっていたんですが、正規表現は部分一致のようなのでシンプルなものに変えています。元の例だと DocumentRoot を / にしている場合(ないでしょうけど)に /.svn が見えちゃいますしね。
今までこの方法で対策していたんですが、Directory やら Location やらは適用順序が面倒ですし(セクションの設定 - セクションのマージ方法 のページを何度参照したことか・・・)、他に IP アドレスの制御なんかもやりたいのに Satisfy Any にすると .svn が見えてしまったりとか、何かと取り回しが面倒なので、他の方法に切り替えようかと。
2. RewriteRule
mod_rewrite を使っているので、このモジュールが有効でないと使えません。(レンタルサーバなんかだと怪しいかも?)
RewriteEngine On RewriteRule /\.svn(/|$) - [F]
みたいな感じ。こちらも正規表現は部分一致なのでこの書き方で OK。[F,L] って書いてる例も見かけたけど、Forbidden を返す場合はその場で判定が終了するので L は不要なはず。(明示したほうがわかりやすいのかな?)
これはこれでいいんですが、Passenger(2.2.11)で Rails を動かしていると、Rails 配下のディレクトリについてこの設定は有効にならない模様。内部的に mod_rewrite 的な処理やキャッシュの処理を行っているらしいので、そちらが先に行われてしまうとかですかね・・・。
ちなみに古い情報だと「Passenger は mod_write や mod_alias と衝突する」という話もあったみたいですけど、その後互換性が向上しているので PassengerHighPerformance を on にしない限りは問題ないらしいです。
とりあえず今回は Passenger を使いたいので、別の方法でいこうと思います。
3. RedirectMatch
mod_alias を使う方法と。
RedirectMatch 403 /\.svn(/|$)
こちらも正規表現は部分一致。Passenger を使っていても動作するようですし、404 を返したいような場合に簡単に差し替えが効きますので、今後はこれでいこうかなと。
あと自分用のメモなんですけど、mod_rewrite と併用する場合は mod_rewrite のほうが先に動作するようなので要注意と。以下の URL にいろいろ書いてました。