Presented by Nishishi via Movable Type. Last Updated: 2009/09/02. 11:43:15.

さくらインターネットでディレクトリ一覧を表示させずに403 Forbiddenエラーを出す方法

正攻法ではファイル一覧表示を禁止できない

さくらインターネットで「/」で終わるURLにアクセスされた際に「403 Forbidden」エラーを返すレンタルサーバの「さくらインターネット」では、index.htmlファイルの存在しないディレクトリをブラウザで表示させると、「そのディレクトリ内のファイル一覧」を表示するようになっています。これを防ぐには、一般的にはApacheの設定を修正し、「Options -Indexes」などと記述すれば良いのですが、この方法は「さくらインターネット」では使えません。

「さくらインターネット」では、.htaccessファイルを使うことでApacheの設定をいくつか記述できます。しかし、Optionsディレクティブの使用は禁止されているため、上記の正攻法は使えません。(使うと、Internal Server Errorになってしまいます。)

ダミーのindex.htmlファイルを配置する方法もありますが、それではHTTPヘッダで「403 Forbidden」エラーは返されず、「200 OK」となって正常なページが返されたという扱いになってしまいます。(それに、ダミーのindex.htmlファイルをいちいち用意するのは面倒です。)

そこで、解決策を考えました。

アクセス拒否設定を使って403 Forbiddenエラーを返す方法で代用

「さくらインターネット」で、ディレクトリ内のファイル一覧を表示させずに「403 Forbidden」エラーを返すには、.htaccessファイルに以下のように記述します。(4行)

DirectoryIndex 403.html
<Files 403.html>
   deny from all
</Files>

上記の設定は、次の2つの意味を表しています。

  • ディレクトリ名で終わるURLでアクセスされたら 403.html ファイルを返す
  • 403.html ファイルへのアクセスを拒否する

「403.html」というファイル名は適当に考えたものなので、「abc.html」とか何でも構いません。ただ、「index.html」と書いてしまうと、本当にindex.htmlファイルを配置したディレクトリに対しても、問答無用で「403 Forbidden」エラーを返してしまうので困ったことになります。ここには、実在しないことが確実に分かっている適当なファイル名を指定しておきましょう。

上記の設定がなされた上で、ディレクトリ名(「/」記号)で終わるURLにアクセスすると、ディレクトリ内のファイル一覧は表示されず、「403 Forbidden」エラーが返されます。

これは実際には、

  1. URLが「/」で終わっているので、403.html ファイルの存在を探す
  2. 403.html ファイルへのアクセスは拒否されているので、403 Forbiddenエラーを返す

という2段階の処理になっています。
なお、「403.html」というファイルを実際に用意する必要はありません。(用意してもしなくても、403 Forbiddenエラーになります。)

というわけで、この方法なら、まるでOptionsディレクティブを使ってディレクトリ内のファイル一覧表示を無効にしたかのような結果を出すことができます。

なお、アクセス拒否設定については、ついさっきAll Aboutで公開された記事「指定ファイルへのアクセスを拒否する方法」に書いたのでそちらもどうぞ。(^_^;;;

この日記へのコメントはお気軽に! コメント数:3 トラックバック数:0

コメント

さくらインターネットでCGIのディレクトリにgoogleのrobotが来て、キャッシュが残ってしまい困っていました。
お陰でForbidden出来ました!有難うございます!m(_ _)m

投稿者 risa : 2008年12月09日 14:03

risaさん、こんにちは。
お役に立てたようで何よりです。(^_^)

投稿者 にしし : 2008年12月09日 23:36

はじめまして。
この記事通りに設定したところ
「正規のindex.htmlを配置してあるディレクトリも403.htmlに飛ばされ」てしまいました。

で、その後 あれこれ調べ、
さくら公式の
TOP>サポートTOP>オンラインマニュアル>.htaccessでアクセス制御する
を参考に、

DirectoryIndex index.html /403.html
<Files 403.html>
   deny from all
</Files>

とやったら、index.htmlがあるページではそれを表示。
そうでなければアクセス拒否、と振り分けることが出来ました。

私と同じミスをする方がいるとアレなので、
一応、ご報告させていただきます。
ご迷惑な投稿となってしまっていたら、すみません。

投稿者 はじめまして : 2009年09月02日 09:12

コメント数: 3件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

投稿後、投稿できていないように見えることがあります。ブラウザのキャッシュが読まれているだけですので、ページを再読込すれば(=たいてい[F5]キーを押せば)投稿内容が反映されていることが確認できるはずです。連続投稿を試す前にご確認下さい。(^^;)

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)