.htaccessとは？

`.htaccess` と言う単語自体はちょくちょく聞いたりしてたんですが、
そもそも `.htaccess` 自体が何なのか、何を指しているのかよくわからなかったので、
それに関しての備忘録です。

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

>
※ 2020/07/20 追記
.htaccess は Apache でのみ使用可能です。
Nginx などでは使用できません。

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

# いつ .htaccess ファイルを使うか
## 基本使わない
**基本的に、.htaccess ファイルの使用は極力避けてください。**

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

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

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

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

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

# .htaccess ファイルの作り方
windows環境では、「.htaccess」というネーミングでファイルを作成する場合、「.htaccess.」と入力してください。
※ファイル名の最後にドット（．）を入れることで作成出来ます。

# .htaccess で出来る事
代表的な５つの項目に分けて、順に設定手順を解説していきます。

## １．ベーシック認証
ディレクトリなどに認証を付けてID/パスワードの入力を強制する仕組みのことです。
用途としては、以下のようなものがあります。

>
- 公開前のサイトをユーザーとGooglebot共に弾きたい場合
- ID/パスワードを知っている人だけに公開したい場合


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

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

```apache
AuthUserfile /フルパス/.htpasswd
AuthGroupfile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
```

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

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

```apache
id:password
```

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

## ２．301リダイレクト
SEOで最も利用される転送方法で、旧ページから新ページへ評価を継承できるものです。
恒久的な移転と呼ばれ、URLの変更やドメインの移転の際に利用します。

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


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

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

## ３．URLの正規化
URLを1つに統一することを指します。
例えば、以下の場合、Googleはそれぞれ別のURLという認識を行なうものの、一般的には同じページが表示されます。

>
+ http://example.com/
+ http://example.com/index.html
+ http://www.example.com/

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

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

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

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

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

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

## ４．ファイル一覧表示の中止
**ディレクトリ構造が外部に公開されるセキュリティ的な懸念を無くす**ために使用します。

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

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

![img](https://qiita-image-store.s3.amazonaws.com/0/198450/69652b54-f6c3-ca4d-ed75-b4d0aabd2f0e.png "ディレクトリ内のファイル一覧")
出典：http://astro.jp/pn/linux/3262

このように**ディレクトリを公開することは、Webサイトの構造を公開すること**になり、セキュリティの観点から見ると一定のリスクがあります。
そこで、ディレクトリ内のファイル一覧表示を中止することで、ディレクトリ構造の公開を防ぐことができます。

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

```apache
Options -Indexes
```

## ５．特定のIPアドレスやドメインからのアクセス制限
特定のIPアドレスやドメインからのアクセスを制限・拒否することが出来ます。
また、逆に特定のIPアドレスやドメインからのアクセスのみ許可することも出来ます。

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

>
+ IPアドレス：`192.168.1.1`
+ ドメイン：`example.com`

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

```apache
order allow,deny
allow from all
deny from example.com
deny from 192.168.1.1
```

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

```apache
order deny,allow
deny from all
allow from example.com
allow from 192.168.1.1
```

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

```apache
<files test-file.html>
    order deny,allow
    deny from all
    allow from example.com
    allow from 192.168.1.1
</files>
```


# 参考リンク
- [Apache コア機能][allowoverride]
- [Apacheチュートリアル : .htaccessファイル][apache]
- [301リダイレクトについて、必要性と設定手順をまとめてみた][301redirect] 
- [.htpasswd生成][makePass]

[allowoverride]:http://httpd.apache.org/docs/trunk/ja/mod/core.html#allowoverride
[apache]:https://httpd.apache.org/docs/2.4/ja/howto/htaccess.html
[makePass]:http://tech-unlimited.com/makehtpasswd.html
[301redirect]:http://viral-community.com/seo/301-redirect-2992/