.htaccess の書き方（設定変更編）

1. [.htaccess の書き方（リダイレクト編）](http://qiita.com/shotets/items/1f8f308e008dcb96bf43)
2. [.htaccess の書き方（アクセス制御編）](http://qiita.com/shotets/items/17bed9029140a6d925d2)
3. [.htaccess(Apache) の Order Allow,Deny(またはDeny,Allow)について](http://qiita.com/shotets/items/58a69aa15e2adc9f930a)
4. [.htaccess の書き方（スピードアップ編）](http://qiita.com/shotets/items/a5465fb41623cc3dae94)
5. **.htaccess の書き方（設定変更編）**


## オリジナルのエラーページに変更する

エラーページを用意して、トップページへの正しいURLへのリンクを貼っておけば
エラーページからの離脱が減らせるかもしれません。
書き方には３パターンあります。

```apache:.htaccess
# エラーメッセージをカスタマイズするだけ。日本語だと文字化けします。タグ使えます。
ErrorDocument 404 "404 (x_x) page ga arimasen.<br><a href=http://yahoo.co.jp/>yahoo</a>"
# ルート相対でファイルを指定。相対パスでは書けません。
ErrorDocument 404 /404error.html
# URLで指定。
ErrorDocument 404 http://404.example.com/
```

### 主なエラーページ

404は最低限用意しておきたいですね。

```apache:.htaccess
# 400 Bad Request（不正な要求）
ErrorDocument 400 /400error.html
# 401 Unauthorixed（ベーシック認証等で認証失敗）
ErrorDocument 401 /401error.html
# 403 Forbidden（アクセス権限なし）
ErrorDocument 403 /403error.html
# 404 Not Found（ページが見つからない）
ErrorDocument 404 /404error.html

# 500 Internal Server Error（サーバーエラー）
ErrorDocument 500 /500error.html
# 502 Bad Gateway（Gatewayやプロキシなどネットワークの途中に問題が発生している）
ErrorDocument 502 /502error.html
# 503 Service Unavailable（アクセス過多やメンテナンス中など、事情によりアクセスできない）
ErrorDocument 503 /503error.html
```

## PHPの設定変更

php_flag は on/off、php_value は値を変更する際に使います。

```apache:.htaccess
# PHPエラーを非表示に
php_flag display_errors Off
# php5.3での参照渡しエラー回避。5.4からは allow_call_time_pass_reference 自体が無効になりますが。
php_flag allow_call_time_pass_reference on
# PHPの出力をgzip圧縮する。圧縮レベルは0 (圧縮しない) から 9 (最高レベルの圧縮) まである。
php_flag zlib.output_compression On
php_value zlib.output_compression_level 5
# インクルードパスを変更
php_value include_path ".:/usr/share/pear:/usr/share/php:/var/www/html/my/php/lib"
```


## ディレクトリの振る舞いを変更する

Options は任意のディレクトリに対して使用できる機能を設定する為のディレクティブ。
書き方は以下の４つ。

```apache:.htaccess
# すべてのオプションを無効にする
Options None
# すべてのオプションを有効にする
Options all
# ExecCGI と FollowSymlinks のみを有効に、他をすべて無効にする。
Options ExecCGI FollowSymlinks
# ExecCGI を有効に、Indexesを無効に変更。
Options +ExecCGI -Indexes
```

.htaccess は上位階層から下位階層に順番に読み込まれます。
CSS のようにどんどん上書きしていくので、下層の .htaccess で設定を書き換えることができます。
指定がなければ上位階層の設定が受け継がれます。

### よく使うオプション

```apache:.htaccess
# シンボリックリンクを有効にする。
Options +FollowSymlinks
# / で終わるURIだった場合にファイル一覧を表示するかしないか。ディレクトリ内に何があるか丸見えになるので普通はしない。
Options -Indexes
# CGI を使えるようにする。
Options +ExecCGI
AddHandler cgi-script cgi
AddType application/x-httpd-cgi .cgi .pl
# SSI の利用を許可します。
Options +Includes
# コンテントネゴシエーション を有効にします。
# Accept-Language ヘッダ値に応じて英語ページや日本語ページを表示させるということが可能になります。
# Options All が指定されていても MultiViews 機能は有効にならないので注意。
Options +MultiViews
```

`-Indexes` でファイル一覧を無効にしておき、/ でアクセスされた場合にデフォルトでアクセスされる index ファイルを `DirectoryIndex` で指定します。左から探し、最初に見つかったファイルを index として表示します。

```apache:.htaccess
DirectoryIndex index.html index.htm index.php index.cgi index.shtml
```

レンタルサーバーならサーバ会社が気を利かせて Apache の設定でサーバ全体に DirectoryIndex の設定をしていると思いますが、インストールしたままだとデフォルトでは以下のようになっているので、その場合は `.htaccess` でちゃんと設定した方がいいでしょう。

```apache:httpd.conf
# apache 2.2 デフォルト
DirectoryIndex index.html index.html.var
# apache 2.4 デフォルト
DirectoryIndex index.html
```

## ファイル（拡張子）の振る舞いを変更する

拡張子の振る舞いを定義する方法は２つあります。

[AddType](http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addtype) ：指定されたファイル拡張子を指定されたコンテンツタイプにマップする
[AddHandler](http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler) ：ファイル拡張子を指定されたハンドラにマップする。

この説明じゃ良く分からないですね。もう少し噛み砕いて説明すると、AddType は最終的にクライアント（ブラウザ）に通知するファイルの種類（MIMEタイプ）を定義しているのに対し、AddHandler はサーバー側がどう扱うかを定義しています。

例えば、PHP や Perl 等のプログラムファイルはサーバーサイドでプログラムを実行し、結果を出力するときには HTML として出力しているのがほとんどです。この場合は以下のように定義されていると想定した結果が出力されます。

```apache:.htaccess
AddType text/html php cgi
AddType application/x-perl pl
AddHandler php5-script php
AddHandler cgi-script .cgi
```

試しに phpinfo を出力する php のファイル名を info.png にすると画像じゃないので何も表示されません。.htaccess に以下を記述すれば phpinfo が表示されます。

```apache:.htaccess
AddType text/html png
AddHandler php5-script png
```


### 主な拡張子の定義

```apache:.htaccess
# CGI を使えるようにする。
Options +ExecCGI
AddHandler cgi-script cgi
AddType application/x-httpd-cgi .cgi .pl .pm
# 拡張子 .html で PHP を動作させたい
AddHandler php5-script .html
# Webフォントがフォントとして認識されない場合
AddType font/opentype .otf
AddType font/eot .eot
AddType font/truetype .ttf
AddType application/font-woff .woff
# PDFや動画などのファイルをダウンロードさせたい
AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4
# SSIを利用したい
Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml
# 拡張子 .html で SSI を動作させたい
AddHandler server-parsed html
# CSS3をIE6.7.8で機能させる為のjavascript「PIE.htc」を認識させる
AddType text/x-component .htc
# HLS(HTTP Live Streaming)
AddType application/x-mpegURL .m3u8
AddType video/MP2T .ts
# WindowMediaメタファイル
AddType video/x-ms-wvx .wvx
AddType audio/x-ms-wax .wax
AddType video/x-ms-asf .asx
# HDML
AddType text/x-hdml;charset=Shift_JIS hdml
# ガラケー用動画
AddType audio/3gpp2 .3g2
AddType video/3gpp2 .3g2
AddType video/3gpp .3gp
AddType audio/3gpp .3gp
AddType application/x-smaf .mmf
```

### Apache は複数の拡張子（メタ情報）を定義できる

AddType や AddHandler で指定しているのは Windows でいうところの拡張子と仕様が少し違う。ファイル名をドットで分割した場合に２つ目以降のキーワードにマッチするものを拡張子として認識する。

例えば、php が AddHandler で定義されている場合は hoge.php.html も hoge.php.txt も、hoge.php.fuga も PHP として動作する。だが、hoge.php_html や php.txt は php として動作しない。 

これは同じ html でも言語やエンコーディング等、複数のメタ情報を指定できるようにするためだ。
例えば、hoge.php.sjis.txt は PHP として動作して　Shift-jis で出力される。test.zh-CN.html は Content-Language が zh-CN（簡体字）になる。

もし、Windows でいうところのファイル名の最後のドット以降のキーワードを拡張子として扱う必要があるなら以下のように指定する。

```apache:.htaccess
<FilesMatch \.cgi$>
SetHandler cgi-script
</FilesMatch>
```

参考
https://httpd.apache.org/docs/current/mod/mod_mime.html#multipleext