ファイルへのアクセス制限やパスワードを掛けたりできます。
ディレクトリやファイルに対して色々な基準でアクセスを禁止することができます。(Apache 1.2以降)
まずアクセス制限したいファイルをFilesで指定します。省略した場合は全てのファイルが対象になります。
<Files ファイル名> ... </Files>
<Files ~ 正規表現> ... </Files>
<FilesMatch 正規表現> ... </FilesMatch>
(Apache 1.3以降ではこちらを推奨)
この中に制限についての記述をすることになります。ファイル名にはワイルドカードとして?と*が使えます。正規表現も使用可能です。
<Files my-*> my-で始まるファイルに対して制限 </Files> <FilesMatch "\.s?html?$"> HTMLファイルに対して制限 </FilesMatch> <Files *> すべてのファイルに対して制限(Filesで囲まなくても同じ) </Files>
allow from ホスト
deny from ホスト
ホストはスペース区切りで列挙可能で、以下の値を使用できます。
IPアドレスの頭3オクテット(24bit分)で制限する場合、"x.x.x."と最後に"."を付けなくてはならないという説明をたまに見掛けますが、別に付けないでも構いません。ちゃんと"1.2.3"で"1.2.3.45"はマッチしますし、"1.2.34.5"はマッチしません(ドットの位置に注目)。ホスト名についても同様で、頭に"."を付けないで、"hoge.ne.jp"と指定しても"proxy.hoge.ne.jp"にマッチしますし、"hogehoge.ne.jp"にはマッチしません。但し、"."を頭につけて".hoge.ne.jp"と指定した時に、"hoge.ne.jp"にはマッチしなくなります。
環境変数によるチェックはBrowserMatch,SetEnvIf等と組み合わせて使用します。これについては後述します。
allow from jp ホスト名がjpで終わる(おそらく)日本からのアクセスのみ許可 deny from 192.168.0 ホストのIPが192.168.0.*の場合不許可 allow from 10.0.0.0/255.0.0.0 ホストのIPが10.*.*.*の場合許可 allow from 172.16.0.0/12 ホストのIPが172.16.*.*〜172.31.*.*の範囲の場合許可 <Files .htaccess> order deny,allow deny from all </Files> .htaccessへのアクセスを禁止する
allowとdenyを評価する順序を指定します。
order 順序
順序は以下の値を指定します。各行の評価でマッチした場合、allowならばアクセス許可、denyならばアクセス不許可の状態になり、残りの評価を続けます。
どの順序を指定した場合でも全てのallow,denyの行は評価されます。また、上の説明で分かると思いますが、orderは複数の種類を定義しても意味がありません(意味が通りません)。私がテストした環境では複数書いてもエラーにはならずに最後に書いたorderが有効になるようでした。何も書かないとorder deny,allowとなるはずですが、書いたほうが後で見たときに解りやすいでしょう。
例えば、次の様な定義がされていたとします。普通は読みやすいようにもっと綺麗な順番で書きますが (^^; 、どのような順で書いても意味は変わりません。
deny from com order deny,allow allow from jp kr deny from 1.0.0.0/8
ケース1:ホストproxy.hoge.ne.jp (1.2.3.4)がアクセスしてきた場合
ケース2:ホストproxy.foo.com (2.4.8.16)がアクセスしてきた場合
ケース3:ホストproxy.hoge.jp (3,6,9,12)がアクセスしてきた場合
すべてのorderについて書くわけにはいかないですが、大体分かるのではないかと思います。
制限によって要求がブロックされた場合は403 Forbiddenエラーになります。
例えば掲示板を読むのは制限しないが書き込みは制限を掛ける、というようなことが可能です。
<Limit メソッド [メソッド [...]]> ... </Limit>
<LimitExcept メソッド [メソッド [...]]> ... </LimitExcept>
(Apache 1.3.5以降)
Limitではメソッドに記述されたメソッドについてアクセスが制限されます。LimitExceptは逆に記述したもの以外全てを対象とします。メソッドは例えば以下のものがあります。また、必ず大文字で書いてください。
<Limit POST> 日記CGIへの書き込みはホストme.exampleに限定 <Files diary.cgi> order deny,allow deny from all allow from me.example </Files> </Limit>
Limitによって制限されたメソッドを要求すると405 Method Not Allowedエラーになります。
特定の環境変数が条件を満たす場合に別の環境変数を定義することができます。Filesと組み合わせる事で例えばリファラ(Referer)による制限を掛けるということが可能になります。CGIを使って行っている例はよく見掛けますが、.htaccessでも同じことが出来るわけです。
The Referer[sic] request-header field allows ... (the "referrer", although the header field is misspelled.)という記述がある通りで、(少なくともHTTP 1.1までは)Refererと書くことになっています。
SetEnvIf 環境変数名 正規表現 設定環境変数名[=値 [設定環境変数名[=...]]]
(.htaccessでの使用はApache 1.3.13以降)
環境変数名が正規表現にマッチする場合は、設定環境変数名が値に設定されます。値が省略された場合、1がセットされます。大文字・小文字を区別しない場合はSetEnvIfNoCaseを使用します。
環境変数名がUser-Agentの場合、代わりにBrowserMatch(NoCase)が使用できます。
BrowserMatch 正規表現 設定環境変数名[=値 [設定環境変数名[=...]]]
(.htaccessでの使用はApache 1.3.13以降)
BrowserMatchでは環境変数名の先頭に!を付けることでその環境変数を未定義にできます。
BrowserMatchNoCase ^Mozilla IsMozilla BrowserMatchNoCase compatible !IsMozilla SetEnvIfNoCase Referer "^(http://([^\.]+\.)?host\.example(:0*80)?(/|$)|$)" FromMyDomainHTTPorUnknown # 特定のファイルにだけ適用する制限の為の環境変数の場合、Filesセクションの中に記述したほうがいいと思います。 <Files *> order allow,deny allow from env=FromMyDomainHTTPorUnknown 条件に一致する場合のみアクセス許可 </Files>