- ブラウザで index.html 等がないディレクトリを見た場合に、ファイル一覧が出ないようにする。
- 見ようとした場合は表示できない旨を伝えて、トップページに誘導する。
以前はこうしてた
以前、Hikware のメインサイトを作った際にもこの対応はしていて、当時は以下のように記述してたのだけど、当時はあまり深く考えずにコピペしてたので、改めて調べなおしてみた。
# ディレクトリに index.html がない場合は 403.html を開こうとするが
# 同時に 403.html のアクセスを禁止しているため、403エラーになり、
# 結果ディレクトリは表示されない
DirectoryIndex index.html 403.html
<Files 403.html>
deny from all
</Files>
# 403/404 エラー時はトップに強制転送
ErrorDocument 403 http://www.hikware.com/
ErrorDocument 404 http://www.hikware.com/
よくなさげ1:なんかバグ技ぽくね?
DirectoryIndex
の最後に敢えてアクセス禁止のファイル名にアクセスさせて 403 を出させる ってのが、どうにも実装の穴を突いたバグ技みたいで不安になる。ちなみに、当時どうやってこの方法にたどり着いたのかと思ったら、参考にしたであろうページがまだ残ってた。
で、みんな今もこんな事してるのかと思いきや、まあ調べてみたところ、ファイル一覧を出さない手段としては定石みたい。でもほとんどの人は以下のように紹介してる。
DirectoryIndex index.html .ht
.ht ってなんやねん。おまけにこの方法を紹介してるサイトの多くが「こうすれば大丈夫みたい」とか無責任な書き口なので、意地でもこのままコピペしたくない。
調べてみたところ、大抵のレンタルサーバとかでは、閲覧者に .htaccess や .htpasswd を見させないように .ht から始まるファイル名はデフォルトでアクセス禁止にしてるので、結果的に最初の例と同じく 403 になるのだけど、サーバのデフォルト設定がそうなってなければ当然動かん。だったら自分で明示的に書いた方がいいわな。結果こうなった。
# .ht* のアクセス拒否。普通はサーバ側でもされてるけど念のため
<Files ~ "^\.ht">
deny from all
</Files>
# インデックスファイル指定と、ディレクトリ一覧の表示拒否
# 左からスキャンしていき、最終的に .ht までくるとアクセス拒否で
# 403エラーになり、結果的にディレクトリ一覧は表示されない。
DirectoryIndex index.html .ht
よくなさげ2:いきなりトップページに飛ばすのよくない
で、403 や 404 エラーの場合、以前は問答無用でトップページの絶対URLに飛ばしてたんだけど、どうもよくないらしい。理由は2つ。
- 閲覧者からすると何が起きたのか分からん。エラーページを挟んだ方が親切。
- 閲覧者がアドレスバーにURLを入力して 403 や 404 になった場合、入力してたURLが消されて飛び先のURLに書き変わるのでイラっと来る。
1 はともかく 2 はしょうがないんじゃね?とか思ったら、ErrorDocument
の飛び先を絶対URLで書いた場合のみリダイレクト扱いになる という仕様らしく、アドレスバーも勝手に書き変わるしステータスコードも想定と違う値になるしでいろいろ問題らしい。知らんかったよ。
一方、ローカルURLで指定すればアドレスバーの内容もそのままでエラーページが表示されるのだけれど、その場合、現在アドレスバーに書かれてるURLのディレクトリでエラーページが開いたような挙動になるので、もし エラーページからcssや画像等を参照する場合は全て絶対パスで書かないといけない。絶対パスだとPC上で気軽にプレビューできなくなるのでちょっと不便。
まあなんにしろ、結果的に以下のように。ちなみにエラーページは こんな。
# エラー時はエラーページに強制転送
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html