Apache
セキュリティ
htaccess

htaccess と言う単語自体はちょくちょく聞いたりしてたんですが、

そもそも htaccess 自体が何なのか、何を指しているのかよくわからなかったので、

それに関しての備忘録です。


.htaccess とは

.htaccess(ドット・エイチ・ティ・アクセス)とは、Apache(アパッチ)などのソフトウェアが使用されている環境で使用可能なディレクトリ単位のWebサーバー設定ファイルです。

これが特定のディレクトリに設置されると、「.htaccess」内に記述されている内容が、設置されたディレクトリ内とその下層のディレクトリ内に対して適用されます。


いつ .htaccess ファイルを使うか


基本使わない

基本的に、.htaccess ファイルの使用は極力避けてください。

ユーザ認証の設定は httpd.conf (サーバ主設定ファイルのこと) に書くことができますし、実際その方がより良い設定方法とされています。


どんな時に使用すべきか

.htaccess ファイルは、ディレクトリ毎の設定を行ないたいけれど、サーバシステムの root アクセス権限を持っていないという場合にのみ使うべきものです。

例えば、レンタルサーバーなどで自分専用にWEBサーバーの設定を変えたい場合は、.htaccess ファイルを格納することで、WEBサーバの設定変更(一部)を行うことができます。

他にも、サーバ管理者が頻繁に httpd.conf の設定変更を行ないたくはないので、個々のユーザが .htaccess ファイルを使って設定変更を行なうことを許可したい!そんな時に使用します。

しかし、使用する場合は、httpd.conf でAllowOverrideディレクティブを使って、最低限の許可しか与えないようにすべきですね。


.htaccess ファイルの作り方

windows環境では、「.htaccess」というネーミングでファイルを作成する場合、「.htaccess.」と入力してください。

※ファイル名の最後にドット(.)を入れることで作成出来ます。


.htaccess で出来る事

代表的な5つの項目に分けて、順に設定手順を解説していきます。


1.ベーシック認証

ディレクトリなどに認証を付けてID/パスワードの入力を強制する仕組みのことです。

用途としては、以下のようなものがあります。



  • 公開前のサイトをユーザーとGooglebot共に弾きたい場合

  • アイパスを知っている人だけに公開したい場合


こちらを設定するには、「.htpasswd」というファイルも必要になります。(作成手順に関しては、上述している.htaccessファイルの作成手順と同じです)

まず、「.htaccess」に下記内容を記述してください。

AuthUserfile /フルパス/.htpasswd

AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

上記の、「AuthUserFile」に記述しているパスに、「.htpasswd」を配置する必要があります。

次に、「.htpasswd」に下記内容を記述してください。

id:password

idはそのまま記載しますが、passwordの箇所は暗号化する必要があるので こうしたサイト を利用して暗号化します。


2.301リダイレクト

SEOで最も利用される転送方法で、旧ページから新ページへ評価を継承できるものです。

恒久的な移転と呼ばれ、URLの変更やドメインの移転の際に利用します。

○設定例:

http://example.com/old.html ページから http://example.com/new.html へ301リダイレクトを行う場合

RewriteEngine on

RewriteRule ^old.html$ http://example.com/new.html [R=301,L]

詳しくは、 301リダイレクトについて、必要性と設定手順をまとめてみた を参照してください。


3.URLの正規化

URLを1つに統一することを指します。

例えば、以下の場合、Googleはそれぞれ別のURLという認識を行なうものの、一般的には同じページが表示されます。



設定例:index.html有り無しの統一(index.html無しに統一する場合)

RewriteEngine on

RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ http://example.com/$1 [R=301,L]

設定例:www有り無しの統一(www無しに統一する場合)

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.example\.com$
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]

因みに、www有りに統一したい場合は、以下のような記述になります。

RewriteEngine on

RewriteCond %{HTTP_HOST} ^example\.com$
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]


4.ファイル一覧表示の中止

ディレクトリ構造が外部に公開されるセキュリティ的な懸念を無くすために使用します。

http://www.example.com/ のように「 /(スラッシュ)」 で終わるアクセスがあったときに、そのディレクトリ内の「index.html」が代替して呼ばれます。

しかし、index.htmlファイルが見つからなかった場合に、下記のようなディレクトリ内のファイル一覧が表示されてしまいます。

img

出典:http://astro.jp/pn/linux/3262

このようにディレクトリを公開することは、Webサイトの構造を公開することになり、セキュリティの観点から見ると一定のリスクがあります。

そこで、ディレクトリ内のファイル一覧表示を中止することで、ディレクトリ構造の公開を防ぐことができます。

設定方法は、「.htaccess」に下記を記述するだけで完了です。

Options -Indexes


5.特定のIPアドレスやドメインからのアクセス制限

特定のIPアドレスやドメインからのアクセスを制限・拒否することが出来ます。

また、逆に特定のIPアドレスやドメインからのアクセスのみ許可することも出来ます。

下記IPアドレスとドメインに対して指定をする場合の例を示します。



  • IPアドレス:192.168.1.1

  • ドメイン:example.com


■アクセスを制限したい場合

order allow,deny

allow from all
deny from example.com
deny from 192.168.1.1

■アクセスを許可したい場合

order deny,allow

deny from all
allow from example.com
allow from 192.168.1.1

また、test-file.htmlというファイル単体に対して指定したい場合は、下記のように記述してください。

<files test-file.html>

order deny,allow
deny from all
allow from example.com
allow from 192.168.1.1
</files>


参考

Apache コア機能

Apacheチュートリアル : .htaccessファイル

301リダイレクトについて、必要性と設定手順をまとめてみた

.htpasswd生成