.htaccessによる設定
WebサーバソフトがApacheである場合に、.htaccessというファイルを用いたWebサイトの設定法について説明します。.htaccessを用いることによって、アクセス制御、リスト表示の設定、エラーメッセージのカスタマイズ、ファイルのMIMEタイプの設定、リダイレクトなどさまざな制御を行うことができます。
.htaccessとは
.htaccess(hypertext acess)は、Webサイトの各ディレクトリに置くことができ、そのディレクトリ内(全てのサブディレクトリを含む)のファイルに対するWebサーバの処理に関する設定を行うためのファイルです。Webサーバに対する設定を、個々のディレクトリの.htaccessに分散させて行うので、.htaccessは分散設定ファイル(distributed configuration files)ともよばれます。
Apacheサーバでは、主にhttpd.conf(サーバのOSによっては、apache2.conf)というファイルを記述することで、Webサーバのさまざまな設定を行います。このファイルは、Webサーバの管理者のみが内容を変更することができます。ユーザはユーザのWebサイト公開用のディレクトリに.htaccessを配置して、このhttpd.confによる設定を上書きして変更することができます。例えば、ユーザtomのWebサイト用ディレクトリの中に[topics]というフォルダがあり、その中にindex.htmlというHTML文書があったとします。Webサイトのルートに対応するURLを、"http://www.cosomos.co.jp/"とすれば、Apacheサーバの場合、このindex.htmlのURLは、
http://www.cosomos.co.jp/~tom/topics/index.html |
となります。Webブラウザから、Webサーバ上のこのHTML文書に対するアクセスのリクエストがあると、Apacheは次の順番でWebサーバのアクセスに関する設定を上書きしていき、その設定を用いて処理を行います。
httpd.conf → [~tom]フォルダ内の.htaccess → [topics]フォルダ内の.htaccess |
ここで、.htaccessは、Webサーバ管理者がhttpd.confで.htaccessによる上書きを許可した場合にのみ有効になることに注意して下さい。一般に.htaccessによる上書きを許可すると、あるファイルを表示する場合に、その全ての祖先ディレクトリの.htaccessファイルを読み込まなければならなくなり、Webサーバの負荷が増大します。また、アクセス制御などのWebサーバの処理内容の設定をユーザに委ねることになるため、Webサーバのセキュリティを考える上で問題となることがあります。このため、.htaccessの使用は、Webサーバ管理者がディレクトリ毎のWebサーバの設定をユーザに委ねたい場合に、httpd.confを設定してはじめて可能となります。
.htaccessファイルの作成法
.htaccessはテキストファイルであり、テキストエディタで作成することができます。ここで、文字エンコーディングをUTF-8として保存する場合は、先頭にBOMをつけないようにします。.htaccessファイルを作成し、特定のフォルダに置くことで、そのフォルダ及びその全てのサブフォルダのアクセス制御を行うことができます。
アクセス制御とは
Webサイトに特定のユーザだけがアクセスできるようにすることを、アクセス制御(access control)といいます。例えば、学校で学生だけが閲覧できる掲示板を設けたり、仲間同士でだけ見るWebサイトを設けたりする場合に、アクセス制御が必要となります。アクセス制御をする方法としては、Webサーバソフトの機能を用いる方法と、PHPなどによるCGIプログラムによる方法があります。
WebサーバソフトがApacheである場合は、httpd.confもしくは.htaccessファイルを設定することで、アクセス制御を行うことができます。これらのファイルによるアクセス制御の方法としては、
- IPアドレスやドメイン名などの接続元のアドレスによりアクセスを制限する方法
- ユーザ名とパスワードによるユーザ認証による方法
IPアドレスもしくはドメイン名によるアクセス制御
ドメイン名によるアクセス制御
特定のドメインからのアクセスのみを許す場合は、.htaccessファイルに次のように記述します。
order deny,allow | |
deny from all | |
allow from cosmos.co.jp |
ここで、各行の意味は次のようになります。
-
order deny,allow
denyとallowの記述順を指定しています。指定できるのは、deny,allowもしくはallow,denyの2つのみです。
-
deny from all
全てのアクセスを禁止します。
-
allow from cosmos.co.jp
アクセス元のURLを逆引きし、cosmos.co.jpで終了するURLからのアクセスのみを許可します。
これによって、ドメイン名がcosmos.co.jpで終わるドメイン(*cosmos.co.jp)からのみアクセスできるようになります。
この例にあるorder,deny,allowなどは、Apacheを設定するコマンドで、ディレクティブ(directive)とよばれます。主設定ファイルであるhttpd.confでは、ディレクティブに関する設定を並べて記述しますが、.htaccessでもhttpd.confと同じにように記述します。
IPアドレスによるアクセス制御
特定のIPアドレスからのアクセスのみを許す場合は、.htaccessファイルに次のように記述します。
order deny,allow | |
deny from all | |
allow from 130.34.152.134 |
これによって、IPアドレスが130.34.152.134である端末からのみアクセスできるようになります。IPアドレスを次のように記述することによって、一定範囲のIPアドレスを指定することができます。
-
130.34.152
130.34.152.*(*の部分は任意をあらわします)
-
130.34.152.0/255.255.255.192
"/サブネットマスク"をつけると、サブネットマスクによって指定されるホストアドレスの部分を指定したことになります。この場合、130.34.152.0-63という意味になります。
-
130.34.152.0/26
"/ネットワークアドレスのビット数"をつけて指定すると、(ネットワークアドレス以外の)ホストアドレスの部分が任意であるIPアドレスの範囲を表します。この場合も、130.34.152.0-63という意味になります。
複数のアドレスに対するアクセス制御
複数のドメイン名やIPアドレスを指定には、次の2つの方法があります。一つは、1つのallowコマンドでドメイン名もしくはIPアドレスを半角スペースで区切って記述する方法です。
order deny,allow | |
deny from all | |
allow from 130.34.152.0/26 130.33.122.0/27 cosmos.co.jp |
もう一つは、複数のallowコマンドを改行して並べて記述する方法です。
order deny,allow | |
deny from all | |
allow from 130.34.152.0/26 | |
allow from 130.33.122.0/27 | |
allow from cosmos.co.jp |
特定の端末からのアクセスを拒否するには、allowとdenyの記述順を逆にします。例えば、
order allow,deny | |
allow from all | |
deny from 130.34.152.134 |
とすれば、IPアドレス130.34.152.134からのアクセスのみ拒否することができます。
ファイル名によるアクセス制御
特定のファイルのアクセス制御を設定するには、.htaccessファイルに次のように記述します。
<Files private.html> | |
order deny,allow | |
deny from all | |
allow from 130.34.152.134 | |
</Files> |
これによって、.htaccessが配置されているディレクトリ内にあるファイルprivate.htmlにアクセス制御が設定されます。ここで、ファイル名の所に*を用いて、
- <Files *.html>
のように指定することができます。このようにすると、拡張子が.htmlである全てのファイルに対してアクセス制御が設定されます。更に、
<Files ~ "\.(gif|jpe?g|png)$"> | |
order deny,allow | |
deny from all | |
allow from 130.34.152.134 | |
</Files> |
のように正規表現を用いる事ができます。この正規表現の各部分の意味は次のとおりです。
\. | ピリオド(.)をあらわします(環境によっては\は¥と表示されます) |
(…) | …の部分をグループ化します |
| | もしくは(OR)をあらわします |
? | 直前の文字が0回もしくは1回登場することをあらわします |
$ | 行の最後である事をあらわします |
つまり、"\.(gif|jpe?g|png)$"は、.gif、.jpeg、.jpg、.pngのいずれかで終わるファイル名を意味します。
正規表現を使った<Files>ディレクティブは、<FileMatch>ディレクティブで記述しても同じ意味となります。例えば、上記の例を<FileMatch>ディレクティブで書くと、次のようになります。
<FilesMatch "¥.(gif|jpe?g|png)$"> | |
order deny,allow | |
deny from all | |
allow from 130.34.152.134 | |
</FilesMatch> |
ユーザ認証によるアクセス制御(基本認証)
ユーザ認証(user authentication)とは、ユーザ名とパスワードによってユーザを識別して、特定のユーザのみがそのシステムを利用可能にするものです。
Apacheで利用できるユーザ認証には、基本認証(basic access authentication)とダイジェスト認証(digest access authentication)があります。基本認証は最もよく使われているユーザ認証方法でがすが、HTTPヘッダーの中にユーザ名とパスワードが暗号化されない形で含まれて送信されるため、機密性の高いページへの認証には適していません。一方、ダイジェスト認証ではパスワード自身は送信されないため、パスワードを盗まれる心配はありません。ダイジェスト認証は最新の主要Webブラウザは全て対応していますが、古いWebブラウザでは対応していない場合があります。
ここでは、基本認証によるアクセス制御の方法を説明し、次の節でダイジェスト認証による方法を説明します。ここで、ApacheはUNIX系のサーバで動作しているとします。以下で、部分的にUNIXのコマンドを使います。
IDとパスワードを格納したファイルを作る
基本認証の設定を行うためには、まずユーザ名とパスワードを格納したファイル(パスワードファイルということにします)を作り、適切な場所に置く必要があります。パスワードファイルを作るには、telnetもしくはsshでWebサーバにログインし、htpasswdコマンドを使います。
(1) telnet/sshでWebサーバにログインする
telnetもしくはsshでWebサーバにログインします。sshでは通信内容が暗号化されるため、安全に通信を行うことができます。telnetで接続するには、Windowsの場合はコマンドプロンプト、Macintoshの場合はターミナルを起動します。sshで接続するには、Windowsの場合はTera Termなどのソフトを使います。Macintoshの場合は、ターミナルでssh接続することができます。
telnetでWebサーバ"www.cosmos.co.jp"に接続する場合は、次のように入力します。
telnet www.cosmos.co.jp⏎ |
すると、パスワードを聞いてきますので、入力します。
Macintoshのターミナルを使ってssh接続する場合は、ユーザ名を"iso"、Webサーバを"www.cosmos.co.jp"とした場合に、次のように入力します(WindowsでTeara Termなどのソフトを使う場合は、ソフトのマニュアルをご覧下さい)。
ssh iso@www.cosmos.co.jp⏎ |
すると、パスワードを聞いてきますので、入力します。
ログインに成功すると、次のようにプロンプト(コマンド入力待ち状態であることを表す記号)が表示されます。
webserver:~ iso$ |
UNIXのコマンドは、このプロンプトの後に入力することができます。
ここで、Webサーバからログオフするには、exitと入力します。
(2) ホームディレクトリの内容を確認する
ログインに成功したら、まずホームディレクトリの情報を表示してみましょう。ディレクトリ情報を表示するには、UNIXのコマンドlsを使います。
webserver:~ iso$ ls -l⏎ |
すると、次のようなファイルの一覧が表示されます。
webserver:~ iso$ ls -l⏎ |
drwx------ 4 iso workgroup 136 Sep 18 15:53 Desktop |
drwx------ 6 iso workgroup 204 Jan 25 13:41 Documents |
drwx------ 49 iso workgroup 1666 Jan 31 13:58 Library |
drwx------ 5 iso workgroup 170 Sep 16 14:26 Movies |
drwx------ 6 iso workgroup 204 Sep 18 10:01 Music |
drwx------ 5 iso workgroup 170 Sep 17 11:06 Pictures |
drwxr-xr-x 4 iso workgroup 136 Sep 13 13:37 Public |
drwxr-xr-x 14 iso workgroup 476 Feb 12 16:10 Sites |
(3) パスワードファイルを配置する隠しフォルダを作る
パスワードファイルは、もし見られたとしても、パスワードが暗号化されているため容易には解読することができません。しかし、十分な予算を確保して多くのCPUパワーを利用できれば、暗号は数時間以内に解読することができます。そのようなことが個人のWebページを対象として行われることはないでしょうが、企業のWebページなどの場合はありえます。このようなことを考慮して、パスワードファイルはWebから閲覧できない場所に置くのがよいでしょう。
もし、ホームディレクトリの中にWeb公開用のフォルダがある場合は、Web公開用のフォルダの外に配置します。そうすれば、Webから閲覧することはできません。それができない場合は、Web公開用のフォルダ内に隠しフォルダを作って、更にパスワードファイル自身も隠します。次に、その方法を示します。
まず、Webサイト用のディレクトリが指定されているときはそのディレクトリに移動します。ディレクトリの移動には、cdコマンドを用います。⑵の例では、SitesがWebサイト用のディレクトリとなっており、このディレクトリに移動する場合は次のように入力します。
webserver:~ iso$ cd Sites⏎ |
webserver:sites iso$ |
次にパスワードファイルを保存するフォルダを作成します。フォルダを作成するには、mkdirコマンドを用います。ここでは、Sitesフォルダの中に.secureフォルダを作成します。ここで、".secure"と最初にピリオドを置くことで、UNIXでの隠しファイルとなります。
webserver:sites iso$ mkdir .secure⏎ |
(4) パスワードファイルを作る
.secureフォルダ内にパスワードファイルを作ります。
まず、.secureフォルダの中に移動します。
webserver:sites iso$ cd .secure⏎ |
webserver:.secure iso$ |
htpasswdコマンドでパスワードファイルを作ります。htpasswdコマンドの書式は次のとおりです。
htpasswd オプション パスワードファイル名 ユーザ名 |
htpasswdコマンドのオプションを下の表に示しておきます。
オプション | 意味 |
---|---|
-c | パスワードファイルを作る |
-n | パスワードの入力を促すが、パスワードは変更しない |
-m | パスワードの暗号化にMD5を使用する(初期値) |
-d | パスワードの暗号化にcrypt()関数を用いる |
-p | パスワードを暗号化しない(プレーンテキストのパスワードを使用) |
-s | パスワードの暗号化にSHAを使用する |
-b | 処理内容を表示する |
-D | 指定されたユーザを削除する |
例えば、パスワードファイルの名前を".htpasswd"、最初に登録するユーザの名前を"tom"とする場合、"htpasswd -c .htpasswd tom"と入力します。すると、tomに対するパスワードをきいてきますので入力します(確認も含めてパスワードは2回入力します)。
webserver:.secure iso$ htpasswd -c .htpasswd tom⏎ |
New password: |
Re-type new password: |
Adding password for user tom |
webserver:.secure iso$ |
パスワードファイルが作成できたら、その内容を表示してみましょう。ファイルの内容を表示するには、catコマンドを用います。
webserver:.secure iso$ cat .htpasswd⏎ |
すると、次のようにファイルの内容が表示されます。
tom:$apr1$Cs/w4QOM$Y1OaGcz8Ycn2stf74HqgW0 |
最初の"tom"は登録したユーザのユーザ名です。コロン(:)の後の文字列は、パスワードを暗号化したものです。
(5) ユーザを追加・削除する、パスワードを変更する
パスワードファイルにユーザを追加するには、htpasswdコマンドでオプションの"-c"を省いて入力します。例えば、ユーザ"jerry"を追加するには、次の様にします。
webserver:.secure iso$ htpasswd .htpasswd jerry⏎ |
New password: |
Re-type new password: |
Adding password for user jerry |
webserver:.secure iso$ |
追加できたかどうか、catコマンドで確認してみましょう。
webserver:.secure iso$ cat .htpasswd⏎ |
tom:$apr1$Cs/w4QOM$Y1OaGcz8Ycn2stf74HqgW0 |
jerry:$apr1$k/9qnBHc$UoQCB5dMbyKKOb6x.khVU0 |
webserver:.secure iso$ |
既存ユーザを削除する場合は、オプションで"-D"を指定します。
webserver:.secure iso$ htpasswd -D .htpasswd tom⏎ |
既存ユーザのパスワードを変更するには、追加と同じコマンドを入力します。
webserver:.secure iso$ htpasswd .htpasswd tom⏎ |
New password: |
Re-type new password: |
Updating password for user tom |
webserver:.secure iso$ |
(6) パスワードファイルを隠す
パスワードファイルを隠すには、ホームディレクトリの.htaccessファイルに次を追加しておきます。これによって、.htで始まるファイル(.htaccessや.htpasswdなど)にWebからアクセスできなくなります。
<Files ~ "^\.ht"> | |
order deny,allow | |
deny from all | |
</Files> |
この方法以外に、.htpasswdや.htacessへのアクセスを禁止する方法として、.htaccessに次を追加する方法もあります。
AddHandler cgi-script htpasswd | |
AddHandler cgi-script htaccess |
これによって、.htpasswdや.htaccessをCGIファイルとして扱わせることができ、Webからのアクセスを禁止することができます。
.htaccessに基本認証の設定を記述する
パスワードファイルが配置できたら、.htacessに基本認証の設定を行います。
⑴ .htaccessに基本認証の記述を追加する
ホームディレクトリの.htaccessファイルに次を追加します。
AuthType Basic | |
AuthName "Please enter username and password" | |
AuthUserFile /home/iso/Sites/.secure/.htpasswd | |
require valid-user |
各行のディレクティブの意味は次のとおりです。
-
AuthType
認証の種類を指定します。基本認証の場合はBasic、ダイジェスト認証の場合はDigestを指定します。
-
AuthUserFile
パスワードファイルの絶対パスを指定します。カレントディレクトリの絶対パスはpwdコマンドで確認することができます。
-
require
認証されたユーザの内、どのユーザが設定されたディレクトリにアクセスできるかを指定します。valid-userを指定すると、認証された全てのユーザにディレクトリへのアクセスを許可します。
requireディレクティブの書式としては、つぎのものがあります。
-
require user ユーザ名
指定されたユーザのみに、ディレクトリへのアクセスを許可します。ユーザ名は半角スペースで区切って複数指定することができます。
例. require user tom jerry
-
require group グループ名
指定されたグループに属するユーザのみに、ディレクトリへのアクセスを許可します。AuthGroupFileディレクティブで、あらかじめグループの定義を行っておく必要があります。
例. require group myfriends
-
require valid-user
認証された全てのユーザに、ディレクトリへのアクセスを許可します。
⑵ 指定したグループのメンバーだけにアクセスを許可する
まず、グループを定義したグループファイルを作成します。グループファイルは、各行にグループ名とグループに属する属するユーザのリストを次のように指定します。
groupname: username1 username2 … |
例えば、.secureフォルダの中に.htgrouplistという名前で次の内容のファイルを配置します。
myfriends: tom jerry | |
myrelatives: nibbles spike tyke |
次に、.htaccessでAuthGroupFileディレクティブでグループを定義したファイルを指定し、requireディレクティブで許可したいグループ名を指定します。例えば、グループ名"myfriends"のグループのメンバーだけにアクセスを許可したい場合は、次のように記述します。
AuthType Basic | |
AuthName "Please enter username and password" | |
AuthUserFile /home/iso/Sites/.secure/.htpasswd | |
AuthGroupFile /home/iso/Sites/.secure/.htgrouplist | |
require group myfriends |
ここで、AuthGroupFileディレクティブの意味は、次のとおりです。
-
AuthGroupFile
グループファイルの絶対パスを指定します。
⑶ ユーザ認証とアドレスによるアクセス制御の併用
.htaccessに、ユーザ認証とアドレスによるアクセス制御を記述した場合、Satisfyディレクティブで、両方を満たさなければならないか、いずれか一方を満たせばよいかどうかを指定できます。
-
Satisfy all
ユーザ認証とアドレスによるアクセス制御の両方を満たさなければならない。
-
Satisfy any
ユーザ認証とアドレスによるアクセス制御のいずれか一方を満たせばよい。
Webブラウザで確認する
WebブラウザにURLを入力してアクセスすると、次のようにユーザ認証の画面が表示されます。パスワードファイルにあるユーザ名とパスワードを入力した場合にのみ、Webページにアクセスできます。
ユーザ認証によるアクセス制御(ダイジェスト認証)
ダイジェスト認証によるアクセス制御の方法を説明します。ダイジェスト認証では、パスワードは送信されないため、第三者によるパスワードの盗難を防ぐことができます。但し、ダイジェスト認証でも通信内容は平文で送られるため、Webページの内容などの通信内容の盗難を防ぐには、通信内容の全てを暗号化するSSH(Secure Shell)などを併用することが必要となります。
ダイジェスト認証を設定するには、基本認証と同じように、パスワードファイルを作り、.htaccessにダイジェスト認証を記述します。以下の手順で、基本認証の設定と同じ部分は詳しい説明を省略しますので、その部分は基本認証の説明を参照してください。
IDとパスワードを格納したファイルを作る
ダイジェスト認証の設定を行うためには、まずユーザ名とパスワードを格納したファイル(パスワードファイルということにします)を作り、適切な場所に置く必要があります。パスワードファイルを作るには、telnetでWebサーバにログインし、htdigestコマンドを使います。
⑴ telnetでWebサーバにログインする
telnetでWebサーバにログインします。
⑵ パスワードファイルを作る
適切な場所にパスワードファイルを作ります。パスワードファイルはWebサイト用フォルダの外に配置した方が安全ですが、ここではWebサイト用フォルダの中に.secureフォルダを作り、その中に配置します。
.secureフォルダの中に移動し、htdigestコマンドでパスワードファイルを作ります。htdigestコマンドの書式は次のとおりです。
htdigest オプション パスワードファイル名 認証領域名 ユーザ名 |
基本認証で用いたhtpasswdコマンドとの違いは、認証領域名(realm)があることです。この認証領域名は、.htaccessのAuthNameディレクティブで指定する認証領域名と同じである必要があります。認証領域名は、ユーザ認証の画面でユーザ名とパスワードの入力を促すメッセージとして表示されます。この際、ユーザがどのWebサイトにログインしようとしているかがわかるように、認証領域名は"members only@cosmos.co.jp"のようにWebサーバのホスト名を入れることが推奨されています。ダイジェスト認証では、領域名をユーザ名やパスワードと共に認証情報の一部として利用します。また、htdigestのオプションは、-c(パスワードファイルを作る)しかありません。
例えば、パスワードファイルの名前を".htdigest"、領域名を"members only@cosmos.co.jp"、最初に登録するユーザの名前を"tom"とする場合は、次のように入力します。
webserver:.secure iso$ htdigest -c .htdigest "members only@cosmos.co.jp" tom⏎ |
Adding user tom in realm members only@cosmos.co.jp |
New password: |
Re-type new password: |
webserver:.secure iso$ |
catコマンドで.htdigestの内容を表示すると、次のようになります。
tom:members only@cosmos.co.jp":110f666eebed1436b9b3b64fd5c414cc |
最初の"tom"は登録したユーザのユーザ名、コロン(:)の後の"members only"は領域名、その後のコロンの後の文字列はパスワードを暗号化したものです。
⑶ ユーザを追加・削除する、パスワードを変更する
パスワードファイルにユーザを追加するには、htdigestコマンドでオプションの"-c"を省いて入力します。例えば、ユーザ"jerry"を追加するには、次の様にします。
webserver:.secure iso$ htdigest .htdigest "members only@cosmos.co.jp" jerry⏎ |
Adding user jerry in realm members only@cosmos.co.jp |
New password: |
Re-type new password: |
webserver:.secure iso$ |
catコマンドで.htdigestの内容を表示すると、次のようになります。
tom:members only@cosmos.co.jp":110f666eebed1436b9b3b64fd5c414cc |
jerry:members only@cosmos.co.jp":81d8fbc439b79cf1d62f1c15572f1617 |
既存のユーザを削除する場合は、htpasswdコマンドをオプション"-D"を指定して用います。
webserver:.secure iso$ htpasswd -D .htdigest tom⏎ |
既存のユーザのパスワードを変更するには、追加と同じコマンドを入力します。
webserver:.secure iso$ htdigest .htdigest "members only@cosmos.co.jp" tom⏎ |
Changing password for user tom in realm members only@cosmos.co.jp |
New password: |
Re-type new password: |
webserver:.secure iso$ |
⑷ パスワードファイルを隠す
基本認証の場合と同じように、.htaccessファイルに次の内容を追加して、パスワードファイルを隠しておきます。
<Files ~ "^\.ht"> | |
order deny,allow | |
deny from all | |
<Files> |
.htaccessにダイジェスト認証の設定を記述する
パスワードファイルが配置できたら、ダイジェスト認証の設定を行います。
⑴ .htaccessにダイジェスト認証の記述を追加する
ホームディレクトリの.htaccessファイルに次を追加します。
AuthType Digest | |
AuthName "members only@cosmos.co.jp" | |
AuthUserFile /home/iso/Sites/.secure/.htdigest | |
require valid-user |
⑵ 指定したグループのメンバーだけにアクセスを許可する
基本認証の場合と同じようにして、指定したグループのメンバーだけにアクセスを許可することができます。
AuthType Digest | |
AuthName "members only@cosmos.co.jp" | |
AuthUserFile /home/iso/Sites/.secure/.htdigest | |
AuthGroupFile /home/iso/Sites/.secure/.htgrouplist | |
require group myfriends |
Webブラウザで確認する
WebブラウザにURLを入力してアクセスすると、次のようにユーザ認証の画面が表示されます。パスワードファイルにあるユーザ名とパスワードを入力した場合にのみ、Webページにアクセスできます。
ディレクトリの制御
.htaccessを使って、索引ファイル名を変更したり、一覧表示をカスタマイズする方法を紹介します。
索引ファイルを変更する
"http://www.cosmos.co.jp/moon/"のようにスラッシュ(/)で終わるURLにアクセスすると、対応するディレクトリの索引ファイルが表示されます。多くの場合、Webサーバの設定で、索引ファイルはindex.htmlもしくはindex.phpとなっています。索引ファイルを変更するには、DirectoryIndexディレクティブを使います。例えば、"http://www.cosmos.co.jp/moon/"に対応するフォルダの.htaccessに、
DirectoryIndex top.html index.php index.html |
と記述すると、まずtop.htmlが呼び出され、top.htmlがない場合は次にindex.phpが呼び出され、index.phpがない場合はindex.htmlが呼び出され、index.htmlがない場合は「403 Forbidden」というレスポンスが返され、Webページにアクセスできなくなります。
索引ファイルを置かないディレクトリで、ファイルの一覧表示をさせない方法の一つとして、DirectoryIndexでの索引ファイルの一覧の最後に、エラーメッセージ用のHTML文書を指定するという方法があります。例えば、
DirectoryIndex index.html errmsg.html |
とすれば、index.htmlがない場合は、errmsg.htmlが表示されます。
ファイル一の覧を表示させないようにする
索引ファイルが存在しない場合、次のようにそのディレクトリにあるファイルの一覧が表示されてしまうことがあります。
ファイルの一覧が表示されてしまうとき、表示させないようにするには、.htaccessに次の内容を追加します。
Options -Indexes |
すると、次のように一覧は表示されなくなります。
逆に、ファイルの一覧が表示されないときに表示するようにするには、.htaccessに次の内容を追加します。
Options +Indexes |
この例のように、Indexesの冒頭の+は機能の有効化を、-は機能の無効化をあらわします。
ファイルの一覧表示をカスタマイズする
ファイルの一覧が表示されるときに、IndexOptionsディレクティブで一覧の表示法を変更することができます。例えば、ファイルとフォルダが混在して表示されていて見づらい場合は、.htaccessに次の内容を追加します。
IndexOptions +FancyIndexing +FoldersFirst |
すると、次のようにフォルダとファイルが分けて表示されます。
ここで、IndexOptionsディテクティブのオプションとして、+FancyIndexingと+FoldersFirstの2つが指定されています。FancyIndexingは飾り付きで一覧を表示する、FoldersFirstはフォルダを最初に表示することを意味します。この例のように、ディレクティブに複数のオプションを指定する場合は、オプションを半角スペースで区切ってまとめて記述することもできますし、次のように一つ一つ行を変えて記述することもできます。
IndexOptions +FancyIndexing | |
IndexOptions +FoldersFirst |
次の表にIndexOptionsディレクティブで使用できる主なオプションを示します。
オプション | 意味 |
---|---|
FancyIndexing | 飾り付きインデックスを有効にします。 |
FoldersFirst | フォルダを最初に表示するようにします。 |
IconsAreLinks | アイコンもファイル名へのリンクに含めるようにします。 |
IconHeight=pixels | アイコンの高さをピクセル単位で指定します。 |
IconWidth=pixels | アイコンの幅をピクセル単位で指定します。 |
IgnoreCase | 大文字と小文字を区別せずに一覧をソートします。 |
NameWidth=n | Name欄の幅をバイト数で指定します。nを*とすると、必要な長さに自動的に拡張します。 |
ScanHTMLTitles | ファイルの説明文がない場合に、HTML文書のタイトル要素の内容を抜き出してdescription欄に表示します。 |
SuppressDescription | description(説明)の欄を削除します。 |
SuppressIcon | FancyIndexingの一覧からアイコンを削除します。 |
SuppressLastModified | FancyIndexing 一覧において最終更新日時の欄を消去します。 |
SuppressRules | 水平区切り線を消去します。 |
SuppressSize | FancyIndexingの一覧においてファイルサイズの欄を消去します。 |
VersionSort | バージョン番号を含んだファイルが自然な方法でソートされるようにします。 |
ファイル一覧に表示しないファイルを指定する
ファイル一覧に表示したくないファイルがある場合は、次のように指定します。
IndexIgnore *.ini _settings |
このようにすると、拡張子に.iniがついたファイルと_settingsといファイルは一覧に表示されなくなります。
ファイル一の覧のアイコンを変更する
ファイル一覧において、登録されていないファイルの種類は、?マークのアイコンで表示されます。
このアイコンを変更するには、次の内容を.htaccessに追加します。
AddIcon /icons/scirpt.gif .js .php |
ここで、/icons/はApacheのインストールフォルダの中の[icons]フォルダ(例えば、Ubuntu Serverでは/usr/share/apache2/icons/)をあらわしています。このフォルダの中に、いろいろなアイコン・ファイルが入っています。その中のscript.gifを、拡張子が.js及び.phpであるファイルのアイコンとして設定しています。
エラーメッセージのカスタマイズ
WebブラウザがWebサーバにアクセスする場合、まずWebブラウザがWebサーバに対してリクエストメッセージを送信します。リクエストメッセージを受信したWebサーバは、Webブラウザに対してレスポンスメッセージを返します。この際、レスポンスメッセージの先頭のレスポンス行にWebサーバの処理が正常になされたかどうかを示すステータスコードが含まれます。リクエストが正常に処理された場合、ステータスコードは2XX(XXは2桁の数)となります。一方、リクエストが正常に処理されずに何らかのエラーが発生した場合、エラーの内容に応じたステータスコードが返されます。特に、Webブラウザからのリクエストに誤った構文が含まれていたり、処理できない要求が含まれている場合、ステータスコードは4XXとなります。最も良くあるステータスコードは以下の値です。
401 | 認証に失敗した |
403 | Webページへのアクセス権がない |
404 | Webページのファイルが見つからない |
エラーを示すステータスコードが返されたとき、Webブラウザはステータスコードに応じて次のようにエラーメッセージを表示します。
このエラーメッセージの画面を、自分が作成したページに変更するには、次のように.htaccessに記述します。
ErrorDocument 401 /~iso/error/401.html | |
ErrorDocument 403 /~iso/error/403.html | |
ErrorDocument 404 /~iso/error/404.html |
ここで、"/~iso/error/401.html"の部分は、HTML文書401.htmlのWebサイトのルートからの相対パスです。ここで、401.htmlなどのエラーメッセージを表示するためのHTML文書の場所や名前は任意です。こうすると、ステータスコードが404である場合、HTML文書/~iso/error/404.htmlが表示されるようになります。
MIMEタイプ・文字エンコーディング・言語に関する設定
特定の拡張子に対するMIMEタイプの設定
Webブラウザはファイルの種類をMIMEタイプで区別しています。Webブラウザがファイルを読み込むとき、そのファイルのMIMEタイプを正しく認識しないと、正しく表示することができません。
WebサーバソフトApacheでは、mime.typesというファイルに各MIMEタイプをもつファイルの拡張子を定義しています。例えば、JPEGファイルのMIMEタイプは"image/jpeg"ですが、mime.typesでは、
image/jpeg | jpeg | jpg | jpe |
のように記述されています。これは、拡張子が.jpeg, .jpg, .jpeであるファイルはMIMEタイプが"image/jpeg"であることをあらわしています。WebブラウザがWebサーバ(Apache)にHTTPリクエストを送信すると、Webサーバはこのmime.typesを見てファイルの MIMEタイプを調べ、それをHTTPレスポンスヘッダのContent-typeフィールドの値として挿入して送信します。Webブラウザは、基本的にはContent-typeの情報にもとづいてファイルを解釈して表示します。Webサイトに配置されたファイルの拡張子のMIMEタイプがmime.typesファイルに定義されていない場合、MIMEタイプが正しく送信されず、正しく表示されないことになります。
AddTypeディレクティブを使うと、拡張子毎にMIMEタイプの定義を追加したり変更したりすることができます。AddTypeディレクティブで、拡張子のMIMEタイプを定義するには、AddTypeに続いて、MIMEタイプを指定し、その後に半角スペースで区切った拡張子を記述します。例えば、
AddType imgae/jpeg jfif |
とすると、拡張子がjfifのファイルのMIMEタイプを"image/jpeg"と定義します。ここで、拡張子の先頭にあるピリオド(.)はつけてもつけなくともどちらでもかまいません。
特定の拡張子に対する文字エンコーディングの設定
テキストファイルなど、そのファイルの種類が文字エンコーディングに関係する場合に、AddTypeディレクティブを使うと、MIMEタイプに加えて文字エンコーディングの定義を追加・変更できます。例えば、次のように.htaccessに記述します。
AddType "text/html; charset=UTF-8" html htm | |
AddType "text/plain; charset=Shift_JIS" txt |
これによって、拡張子が.htmlもしくは.htmのファイルに対してMIMEタイプがtext/htmlで使用する文字エンコーディングがUTF-8に、拡張子がtxtのファイル対してMIMEタイプがtext/plainで使用する文字エンコーディングがShift_JISに設定されます。
特定の拡張子のファイルをダウンロードさせるようにする
a要素でリンクを設定した場合、アンカーをクリックすると、Webブラウザはリンク先のファイルを開いて表示します。これを、表示するのではなくダウンロードするようにするには、次のように.htaccessに記述します。
<FilesMatch "\.(pdf|xls|doc|ppt)$"> | |
Header set Content-Disposition attachment | |
</FilesMatch> |
これによって、拡張子が.pdf, .xls, .doc, .pptのいずれかであるファイルは、アンカーをクリックするとダウンロードされるようになります。ここで、WebサーバにMIMEタイプが登録されていない拡張子のファイルを指定する場合は、Headerディレクティブの前にAddTypeディレクティブでその拡張子のMIMEタイプを設定しておきます。Headerディレクティブは、HTTPレスポンスヘッダの内容を設定します。"Header set Content-Disposition attachment"とすると、HTTPレスポンスヘッダーのContent-Dispositionフィールドの値を"attachment"に設定します。Content-Dispositionは次の値をとることができます。
-
attachment
ファイルを添付書類として扱い、内容を即座に表示すべきではないことをあらわす
-
inline
ファイル内容を画面に即座に表示すべきであることをあらわす
ここで、Headerディレクティブは、Apacheのmod_headersというモジュールが有効である場合に使用できます。Webサーバの設定によっては、このモジュールが有効でない場合があります。その場合、Headerディレクティブを.htaccessに記述するとエラーが生ずることになりますので、これを避けるために、次のように記述を変更するとよいでしょう。
<IfModule mod_headers.c> | |
<FilesMatch "\.(pdf|xls|doc|ppt)$"> | |
Header set Content-Disposition attachment | |
</FilesMatch> | |
<IfModule> |
ユーザの使用言語に合わせてページを表示する
HTTP/1.1では、リクエストヘッダに含まれるデータを使って、Webブラウザからの1つのリクエストに対して、レスポンとして返すリソース(ファイル)を複数の選択肢の中から選ぶことができる仕組みが定められています。これを、コンテント・ネゴシエーション(content negotiation)といいます。Apacheサーバでコンテント・ネゴシエーション機能を有効にするには、MultiViews機能を有効にします。.htaccessでMultiViews機能を有効化するためには、次のように記述します。
Options +MultiViews |
ここで、"Options All"としても、MultiViews機能は有効化されないことに注意して下さい。
ここでは、ユーザの使用言語に応じて異なるWebページを表示する「言語ネゴシエーション」の方法を紹介します。これは、リクエストヘッダのAccept-Languageフィールドで最優先の言語が日本語であれば日本語のページを、英語であれば英語のページを表示するというものです。言語ネゴシエーションを行うには、.htaccessに次のように記述します。
Options +MultiViews | |
AddLanguage jp .jp | |
AddLanguage en .en | |
LanguagePriority jp en |
これによって、.jpという拡張子のファイルは日本語に、.enという拡張子のファイルは英語に対応づけられます。例えば、URLにaboutpage.htmlというファイル名で入力して表示させる場合は、次の2つのファイルを用意します(注:aboutpage.htmlは削除しておく必要があります)。
aboutpage.html.jp | 日本語のページ |
aboutpage.html.en | 英語のページ |
すると、ユーザの設定した使用言語に応じて2つのHTMLファイルのいずれかが表示されます。使用言語が日本語でも英語でもない場合は、LanguagePriorityディレクティブの設定によって、aboutpage.html.jpがあればそれが優先されて表示され、aboutpage.html.jpがなければ次の優先順位であるaboutpage.html.enが表示されます。
CGI・SSIに関する設定
CGIを利用できるようにする
CGIプログラムの誤動作はWebサーバの暴走にもつながるため、多くのユーザが利用するレンタルサーバでは特定のCGIを利用できるようにしているか、もしくは禁止している場合があります。もし、CGIの利用が許可されている場合であれば、CGIプログラムを置くディレクトリの.htaccessに次のように記述することで、独自のCGIプログラムを利用できるようになります。
Options +ExecCGI | |
AddType application/x-httpd-cgi cgi pl |
ここで、"Options +ExecCGI"は、CGIを有効にします。2行目のAddTypeディレクティブは、CGIプログラムファイルの拡張子を .cigもしくは.plと定義しています。
SSIを利用できるようにする
SSIは、Webサーバの負荷を増大させるため、使用できないように設定されている場合があります。また、使用できる場合でも、以下に述べるように.htaccessで設定しなければならない場合があります。
SSIを利用できるファイルの拡張子はshtmlです。この拡張子でSSIを実行できるようにするには、.htaccessに次のように記述します。
Options +Includes | |
AddType text/html shtml | |
AddOutputFilter INCLUDES shtml |
ここで、"Options +Include"は、SSIを有効にします。AddOutputFilterディレクティブは、ファイルの拡張子にサーバからの応答を処理するフィルタを対応づけます。今の場合、拡張子shtmlのファイルをSSIで処理するように設定します。
SSIをshtml以外の拡張子で利用できるようにする
通常、SSIを実行できるファイルの拡張子は.shtmlですが、.htmlや.htmでも実行できるようにするには、.htaccessに次のように記述します。
Options +Includes | |
AddHandler server-parsed html htm |
但し、このようにすると全ての拡張子が.htmlであるファイルに対してSSIの処理を行うことになり、Webサーバの負荷が増大します。このため、使用する場合はSSIを実行するHTMLファイルのみを集めたディレクトリを用意し、その中の.htaccessでこの設定を行うようにした方がよいでしょう。
SSIを特定のファイルで使用できるようにする
SSIを許可するもう一つの方法は、XBitHackディレクティブを使うことです。この方法を使えば、拡張子が.htmlでもSSIを使用できるようになります。次の内容を、.htaccessに記述します。
Options +Includes | |
XBitHack on |
XBitHackをonに設定すると、Apacheサーバはファイルが実行可能である(実行のパーミッションが有効となっている)場合にSSIの処理を行います。
SSIで処理を行わせるように、ファイルに実行のパーミッションを与えるには、Webサーバにtelnetもしくはsshでログインして、chmodコマンドを用います。例えば、ユーザのWeb公開用のディレクトリを[Sites]とし、その中の[topics]ディレクトリにあるindex.htmlに対してSSIを使用できるようにするには、次のようにします。
⑴ [topics]ディレクトリに.htaccessを設置する
[topics]ディレクトリに上記内容の.htaccessをアップロードします。
⑵ [topics]ディレクトリ内のファイルのパーミッションを読み込みのみにする
Webサーバにログインし、index.html以外のファイルに対してはSSIの処理を行わないように、[topics]ディレクトリの全てのファイルのアクセス権をグループとその他に対して読み込みのみに変更します。
$ chmod 744 Sites/toppics/* |
⑶ index.htmlに実行のパーミッションを設定する
index.htmlに対してはSSIの処理が行われるように、パーミッションをグループと他者に対して読み込みと実行(書き込みは禁止)に設定します。
$ chmod 755 Sites/toppics/index.html |
他のページへのリダイレクト
Webサイトを他のURLに引っ越した場合など、旧Webサイトの訪問者に引っ越し先を知らせたり、自動的に新しいWebページに移動させたい場合があります。この場合の一つの方法として、.htaccessによるリダイレクトがあります。この方法を使えば、訪問者に気づかれることなしに、瞬時に新しいWebページに移動させることができます。
例えば、旧Webサイトを"http://www.oldsite.co.jp/"とし、"http://www.oldsite.co.jp/topics/"に対応するディレクトリの内容全てを新しいWebサイトに引っ越すとします。新Webサイトを"http://www.newsite.co.jp/"とし、引っ越し先のディレクトリのURLを"http://www.newsite.co.jp/oldtopics/"としたい場合、.htaccessに次のように記述します。
Redirect permanent /topics/ http://www.newsite.co.jp/oldtopics/ |
ここで、"/topics/"の部分は、旧Webサイトのルートディレクトリからのパスです。このようなWebサイトのルートディレクトリからのパスの先頭にスラッシュ(/)をつけたものを、URLパス(URL-path)とよびます。また、引っ越し先は任意のURLを指定することができます。このように設定すると、旧Webサイトの[topics]ディレクトリ内の全てのファイルが、新Webサイトの中の[oldtopics]ディレクトリ内の同名のファイルに移動します。