- ブラウザで index.html 等がないディレクトリを見た場合に、ファイル一覧が出ないようにする。
- 見ようとした場合は表示できない旨を伝えて、トップページに誘導する。
【2024/4更新】さくらインターネットではファイル一覧の表示はデフォルトで無効化されてた
次項から書いてある手法は、僕が利用しているさくらインターネットでは、以前は簡単にファイル一覧を無効化できなかったのでやっていた手法。
さくらではすでに 2017 年あたりからファイル一覧の表示はデフォルトで無効化されたようで、2024/4 に改めて調べてみた結果は以下。
ファイル一覧の表示はデフォルトで無効
ディレクトリに index.html 等がない場合、デフォルトではファイル一覧は表示されず、403 Forbidden
エラーになる。なのでファイル一覧を表示させないために何かしらの設定をする必要はない。
.htaccess で Options Indexes
の設定が変更できるように
.htaccess でファイル一覧の表示を指定できる以下の記述は、以前はさくらでは使えなかったのだけれど、2024/4 現在は変更可能。
# ファイル一覧の表示を無効化(さくらではデフォルトで無効なので書かなくてもOK)
Options -Indexes
# 逆にファイル一覧の表示を有効化したければこのように
Options +Indexes
さくらのサーバコントロールパネルの .htaccess の編集機能を使った場合も上記の記述になるので、これが現在の公認の手法と思われる。
ということで今となっては後述の手法は使わないのだけれど、レンタルサーバの方針で .htaccess での Options -Indexes が指定できない場合の手法ということで一応残しとく。あと最後の方は別件の話だし。
【過去の話】初めて対応した頃はこうしてた
以前、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 や画像等を参照する場合は全て / からのサイト内絶対パスで書かないといけない ので注意。
まあなんにしろ、結果的に以下のように。ちなみにエラーページは こんな。
# エラー時はエラーページに強制転送
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html