.htaccessのサンプル・設定 [Fedora, RedHat, CentOS]
作成:2006-03-09、更新:2010-04-08
.htaccessのサンプル・設定方法。
対象:Linux Fedora, RedHat, CentOSなど
.htaccessのサンプル・設定
- .htaccess
- .htaccessは、サイトへのアクセス制御や各種設定ができます。
- Apacheのhttpd.confでも設定できますが、httpd.confに補足する形で使用できます。
- .htaccessは、各ディレクトリに設置し、設置したディレクトリ以下で、その設定が有効になります。
- .htaccessを複数設置した場合、上位のディレクトリに設置した.htaccessから順に認識され、設定が反映されます。
- Apacheのhttpd.confで.htaccessの使用が許可されてないと、.htaccessは利用できません。
- Redirect - リダイレクト
testディレクトリ以下のアクセスをsampleディレクトリにする場合、
Redirect permanent /test/ http://www.example.com/sample/
と書きます。
testディレクトリ以下のディレクトリ構造を維持できるので、
test/a.html、test/b.htmlがあった場合、sample/a.html、sample/b.htmlにリダイレクトできます。
http://www.example.com/test/ から http://www.example.com/sample/ にリダイレクト
(同じサイト内で別のディレクトリにリダイレクト)でも、
http://www.example-test.net/test/ から http://www.example.com/sample/ にリダイレクト
(別のサイトにリダイレクト)でもOK。
また、
Redirect permanent /test/ http://www.example.com/sample/test/
のように、転送先のURLに元のディレクトリ名の文字列(ここれは/test/)が含まれると永久ループしてしまいます。
Redirect permanent /test/ http://www.example.com/sample/test.html
の場合、testディレクトリ以下のアクセスをsample/test.htmlにリダイレクトできます。
Redirect permanent /test/abc.html http://www.example.com/sample/abc.php
のようなリダイレクトもできます。
- RedirectMatch - リダイレクト・マッチ(正規表現)
正規表現を使って、リダイレクトできます。
RedirectMatch (.*)\.html$ http://www.example.com$1.php
の場合、URLの最後が.htmlでアクセスされたものを、.htmlの部分だけ.phpに置き換えてアクセスさせます。
今までHTMLでページを作っていたものをPHPに変更して、ファイル名はそのまま(拡張子だけ変更)というような場合などに利用できます。
RedirectMatch (.*)windows_(.*)\.php$ http://www.example.com/internet/pc/
の場合、windows_という文字を含み、URLの最後が.phpなURLを、http://www.example.com/internet/pc/に転送します。
RedirectMatch (.*)website/(.*)$ http://www.example.com/memo/website/$2
の場合、websiteという文字を含むURLを、http://www.example.com/memo/website/に転送します。
例えば、
http://www.example.com/internet/website/任意のファイル名
を
http://www.example.com/memo/website/任意のファイル名
に転送したい場合、このRedirectMatchを
http://www.example.com/internet/
以下に置きます。
ディレクトリを変更した場合などに利用します。
- AddType - MIMEタイプ・ファイルタイプ
初期設定にないMIMEタイプを追加する場合、AddTypeを利用します。
AddType application/x-httpd-php .php
ファイルの種類によっては、MIMEタイプを設定しないと正常にダウンロードできなかったり、ブラウザで認識されなかったりする場合があります。
- DirectoryIndex - 各ディレクトリのトップページ
http://www.example.com/test/ のようにディレクトリ名だけを指定してアクセスすると、index.htmlやindex.cgiなどが表示されます。
元はhttpd.confに記載されていますが、この最初に表示されるページの優先順位を変更するには、DirectoryIndexを利用します。
DirectoryIndex index.php index.html index.cgi top.html
先頭に書いたものほど優先され、該当のものがなければ順次後ろのファイルを探していきます。
また、ディレクトリ名だけでアクセスしたときに、DirectoryIndexで指定したファイルがすべてなかった場合、ディレクトリ構造の一覧が見えてしまう場合があります。
これを防ぐには、.htというのを追記します。
DirectoryIndex index.php index.html index.htm index.cgi .ht
- ErrorDocument - エラーページを表示
ファイル名やディレクトリ名を変更した場合、リダイレクトなどで転送をしてあげないと、「ページが見つかりません」と表示されます。
ページが見つからなかった場合は、エラー用のページ(ページ移転の告知ページ)を表示すると親切です。
エラーページ(例では404.html)を用意し、さらに.htaccessに以下のように書きます。
ErrorDocument 403 http://www.example.com/data/html/404.html
ErrorDocument 404 http://www.example.com/data/html/404.html
ErrorDocument 500 http://www.example.com/data/html/404.html
- allow、deny - アクセス制限
特定のIPアドレス(例では219.111.65.200)からのアクセスのみ許可したい場合は、
allow from 219.111.65.200
のように書きます。
allow from adsl.example.com
というように、ドメイン名などでも制限できます。
逆に、特定のIPアドレスからのアクセスを拒否したい場合は、
deny from 219.111.65.200
のように書きます。
deny from all
の場合、すべてのアクセスを拒否します。
幅広いIPアドレス帯域を設定するには、ネットマスクを利用して一括してIP帯域を指定できます。
deny from 210.108.0.0/16
210.108.0.0~210.108.255.255までを指定したことになります。
deny from 210.108.
の場合は、210.108.で始まるIPアドレスすべてが対象となります。
ドメインの場合は、
deny from .example.com
というように、ホスト名・サブドメインを省いて制限できます。
order allow,deny
というのをallowやdenyの前に書くと、allowとdenyの優先順位を決めることができます。
先に書いた方が優先されます(例だとallow)。
GETとPOSTに関するアクセスだけに適用するには、Limitを使います。
<Limit GET POST>
order deny,allow
deny from all
</Limit>
- SetEnvIf Referer
リファラ(参照元の情報)を取得して外部のサイトからのファイル(ページ)の参照を禁止できる。
SetEnvIf Referer については、
SetEnvIf Refererの設定
をご覧下さい。
- Options - オプション
Options ExecCGI -Indexes
の場合、CGIの実行を許可し、Indexファイルがない場合、ディレクトリ構造を表示しないようになります。
各オプションは、+や-で、追加、禁止が行えます。
何も書かないと+になります。
オプションには、以下のような項目があります。
ExecCGI CGIの実行許可
Includes SSIの実行許可
IncludesNOEXEC SSIの#execと、#include以外許可
Indexes Indexファイルがない場合に、ディレクトリ構造を表示
All MultiViews以外のすべてのオプション有効
None すべてのオプション無効
FollowSymLinks シンボリックリンク有効
MultiViews MultiViewsを許可
SymLinksIfOwnerMatch ファイル所有者のみシンボリックリンクを許可
- CGI・SSIを利用
CGIが最初から利用できる場合は特に設定は必要ありませんが、.htaccessで指定しないと動作しない場合は、以下のように書きます。
Options ExecCGI
AddType text/html .cgi または AddType application/x-httpd-cgi .cgi
AddHandler cgi-script .cgi
AddType text/html .pl
AddHandler cgi-script .pl
SSIの場合(拡張子shtmlというファイルでSSIを利用する場合)は、
Options Includes
AddType text/html shtml
AddHandler server-parsed shtml
- .htpasswd - パスワードによるアクセス制限(Basic認証)
Basic認証は、ユーザ名とパスワードを入力するウィンドウを表示させて、ページにアクセスできる人を制限できます。
.htaccessと.htpasswdの2つのファイルが必要です。
まず、.htaccessに以下のように書きます。
AuthUserFile /htdocs/sample/.htpasswd
AuthName "Secret Area"
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
AuthUserFileには、.htpasswdを置いたディレクトリのパスを書きます。
次に.htpasswdに以下のように書きます。
sample:ABwOg1D2JDxIQ
これは、ユーザ名:sample、パスワード:test、の場合の例です。
.htpasswdには、「ユーザ名:cryptしたパスワード」という書式で書きます。
ABwOg1D2JDxIQは、testをABという種(salt)をもとにcryptした結果の文字列です。
crypt値は、.htpasswdのcrypt計算にて計算できます。
- メンテナンス中の処理
サイトのメンテナンスを行う場合のサンプル。
・ディレクトリをリネームする例
http://www.sample.com/sample/
を
http://www.sample.com/sample2/
などにしておき、sampleに.htaccessでエラーページを指定する。
ErrorDocument 403 http://www.sample.com/info/maintenance/index.html
ErrorDocument 404 http://www.sample.com/info/maintenance/index.html
ErrorDocument 500 http://www.sample.com/info/maintenance/index.html
・リダイレクトする例(リネームしたくない場合)
http://www.sample.com/sample/
の.htaccessに
Redirect permanent /sample/ http://www.sample.com/info/maintenance/
と書く。
Redirect permanent /sample/ http://www.sample.com/info/sample/
と書くと永久ループになって動作不能。
リダイレクト先に元のディレクトリ名(文字列)を含ませない。
Redirectは、ディレクトリの階層構造がそのまま反映されるので、
http://www.sample.com/info/maintenance/ 以下全てのアクセスがエラーになるので、
http://www.sample.com/info/maintenance/ の.htaccessに
ErrorDocument 403 http://www.sample.com/info/maintenance/index.html
ErrorDocument 404 http://www.sample.com/info/maintenance/index.html
ErrorDocument 500 http://www.sample.com/info/maintenance/index.html
を書く。
・mod_rewriteの利用(Apacheモジュールを追加してもいい人向け)
Apacheのモジュールのmod_rewriteを利用すると、各ページへのアクセスを正規表現を使って制御できます。
mod_rewriteについては、mod_rewriteを参照。