連絡先 Hikwareホーム
Hikware.Tech
自分用の覚え書きをそのまま公開。参考程度にどうぞ。

ディレクトリ一覧を見せない

公開日 2017/08/22
最終更新 2017/10/16
  • ブラウザで 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つ。

  1. 閲覧者からすると何が起きたのか分からん。エラーページを挟んだ方が親切。
  2. 閲覧者がアドレスバーにURLを入力して 403 や 404 になった場合、入力してたURLが消されて飛び先のURLに書き変わるのでイラっと来る。

 1 はともかく 2 はしょうがないんじゃね?とか思ったら、ErrorDocument の飛び先を絶対URLで書いた場合のみリダイレクト扱いになる という仕様らしく、アドレスバーも勝手に書き変わるしステータスコードも想定と違う値になるしでいろいろ問題らしい。知らんかったよ。

 一方、ローカルURLで指定すればアドレスバーの内容もそのままでエラーページが表示されるのだけれど、その場合、現在アドレスバーに書かれてるURLのディレクトリでエラーページが開いたような挙動になるので、もし エラーページからcssや画像等を参照する場合は全て絶対パスで書かないといけない。絶対パスだとPC上で気軽にプレビューできなくなるのでちょっと不便。

 まあなんにしろ、結果的に以下のように。ちなみにエラーページは こんな

# エラー時はエラーページに強制転送
ErrorDocument 403 /error.html
ErrorDocument 404 /error.html