レンタルサーバーでウェブサイト公開しているとき、見られちゃまずいファイルもありますよね。動作ログだとか、設定ファイルなどがそれに該当すると思います。
公開されていない領域にファイルを置けばいいんでしょうけど、レンタルサーバーだとアクセスできる領域が全て公開される様になっていることもあります。
この様な場合にアクセスを禁止するには、.htaccess にアクセス禁止の設定を書きます。
下に詳しい方法を説明しますね。
特定ファイルをブラウザからアクセスできないようにする方法
特定ファイルをブラウザからアクセス出来ないようにするには、アクセス禁止したいファイルが存在するディレクトリに.htaccess ファイルをおいて、アクセスを禁止する設定を追加します。
.htaccess に追加するのは、Filesタグになります。例えば下の様な設定を追加するんです。
1 2 3 |
<Files ~ "default\.cfg"> Deny from all </Files> |
上記設定の場合、.htaccess が置かれたディレクトリに default.cfg が含まれるファイル名のファイルは、全てのIPアドレスのクライアントからのアクセスを禁止します。
ファイル名の指定の方法
チルダ(~)は正規表現を意味します
上記では、Files ~ と 「~(チルダ)」がついています。
これは、正規表現で対象ファイルを指定できる記述方法です。
例えば、
<Files ~ “default\.cfg”>
と書かれた場合には、aaadefault.cfgbbbb のように、指定したファイル名の前後に他の文字列が付いているものも対象になります。
先頭と末尾を指定するには
「default.cfg」というファイルだけを対象にしたい場合、
<Files ~ “^default\.cfg$”>
のように、「^」と「$」を付ける必要があります。
それぞれ、文字列の先頭、末尾 を意味する言葉になります。
ピリオド.は任意の一文字を意味します
また、default\.cfg の様に 「.(ピリオド)」の前に 「\」を付けている理由ですが、「.」は「任意の一文字」を意味するためです。
もし、
<Files ~ “default.cfg”>
と書いた場合、defaultacfgやdefaultzcfg のように、「.」のところにどんな文字があっても禁止対象としてみなされてしまいます。
本来の文字の意味をもたせる円マーク\
正規表現の特殊文字の前に「\」をつけることでその文字自身を意味させることができます。
この場合では、「\.」は「.(ピリオド)」自身を示すということです。
ちなみに「\」自身を示すためには、「\\」とします。
複数の条件を指定する丸かっこ()とパイプ|
他にも、複数のファイルを指定したい場合は、
<Files ~ “^(default\.cfg|test\.log)$”>
のように、()で囲んで 「|」 で複数のファイル名をつなげればOKです。
どれか一文字を示すブラケット[]とその中で使うキャレット^
[文字列]は文字列のうちどれか1文字を示します。
例えば、[abcdef]は、a,b,c,d,e,fのうちどれか一文字を意味します。
ブラケットの中の「-(ハイフン)」範囲を示します。
例えば、[a-z]は、aからzのアルファベットのうち一文字を意味します。
逆に、[^文字列]のようにキャレット(^)が先頭についている場合は、
文字列に含まれない1文字を示します。
例えば、[^abcdef]は、a,b,c,d,e,f以外の1文字を意味し、
[^1-5]は、1,2,3,4,5以外の1文字を意味します
正規表現のルール一覧
上記に説明した正規表現の特殊文字を説明します。
記号 |
意味 |
---|---|
. | 任意の一文字 |
() | グループ化。選択範囲の境界を指定したり、あとで参照するために使います。パイプ|と一緒に使って、OR範囲を明治するのにも使えます。 |
| |
選択を意味します。 |
^ | 行の先頭 |
$ | 行の末尾 |
\ | 特殊文字を本来の文字の意味で使用します。 |
[文字] |
いずれかの1文字。 |
[^文字] |
ここに含まれない1文字。 |
アクセス制限の指示
全てのIPアドレスからのアクセスを禁止するには
1 2 3 |
<Files ~ "^default\.cfg$> Deny from all </Files> |
上記の様に
Deny from all
とすることで、全てのクライアントからのアクセスを禁止しています。
特定のIPアドレスからのアクセスだけ許可するには
また、特定のIPアドレスからのアクセスだけ許可する場合は、
1 2 3 4 5 6 |
<Files ~ "^default\.cfg$> Order Deny,Allow Deny from all Allow from 111.222.333.444 Allow from 123.123.456.456 </Files> |
のように、まず、order で、許可(allow)と拒否(deny)の順番を規定して、
まず、Deny from all で全てのIPアドレスからのアクセスを禁止し、
あとで、Allow from で特定のIPアドレスからのアクセスを許可します。
Orderによって、許可と拒否のどちらを先にするのかを定義しているのです。
だから、上のように、
Order Deny,Allow
と書けば、その後にあるDeny文とAllow文の記述の順がどうであれ、
まず、Denyを設定してからAllowで設定を上書きします。
上の例で、もし、Order Allow, Deny
と書いてしまったら、Allow で特定IPアドレスを許可したあとで、
Deny from all で全てのIPアドレスからのアクセスを拒否する結果になってしまします。
特定のIPアドレスからのアクセスだけ禁止するには
逆に、特定のIPアドレスからのアクセスをだけ禁止するためには、下のように
Order をAllow, Deny の順にして、全てのIPアドレスから許可したあとに、特定のIPアドレスからのアクセスを禁止するようにします。
1 2 3 4 5 6 |
<Files ~ "^default\.cfg$> Order Allow,Deny Allow from all Deny from 111.222.333.444 Deny from 123.123.456.456 </Files> |
アクセスのテスト
バーチャルサーバー(IPアドレス192.168.33.34)にサーバーを立ち上げて、下記のようにlog.txtファイルにアクセス制限をかけています。
IPアドレス 192.168.33.34 のクライアントからのアクセスだけ許可しています。
1 2 3 4 5 |
<Files ~ "^test\.log$"> Order Deny,Allow Deny from all Allow from 192.168.33.34 </Files> |
・IPアドレス 192.168.33.34 からのアクセス
アクセステストは、curl というHTTPアクセスをできるコマンドを使ってます。ブラウザがインストールされてないためです・・・・
ここからアクセスでは、ちゃんとtest.logの中身が取得できています。(error log test.・・・・が ファイルの中身です)
・IP192.168.33.34 以外のパソコンからのアクセス
それに対して、別のコンピュータからのアクセスでは、アクセス禁止されてました。
ちゃんとIPアドレスによって、アクセス許可・拒否がされていることが確認できました。
まとめ
.htaccess に Files タグを記述することにより、特定のファイルをブラウザからアクセス禁止にすることができます。
また、ファイル名の指定には正規表現を使うことができ、アクセス禁止のやり方も、特定のIPアドレスだけ禁止したり、逆に特定のIPアドレスからのアクセスだけ許可したりすることができます。
レンタルサーバーなどで、どうしても公開しているディレクトリに公開したくないファイルを置く必要がある場合、活用してください。
コメント