.htaccessの備忘録

RewriteEngine ディレクティブ

RewriteEngineディレクティブは、URLの書き換えを行うエンジン。URL の書き換え処理を制御できる。デフォルトの設定値は Off になっているため、URL の書き換え処理を行う場合は、On にする。

# RewriteEngine を起動
RewriteEngine On

本ディレクティブを On にすることで、新しい環境変数 SCRIPT_URI と SCRIPT_URL が追加される。

RewriteBase ディレクティブ

RewriteBase ディレクティブは、RewriteRule ディレクティブで指定するリダイレクト先の URL のベースとなるディレクトリを相対パスで指定できる。RewriteBase ディレクティブで URL を指定しない場合、RewriteRule ディレクティブのベースとなる URL は .htaccess が置かれたディレクトリからの相対パスとなる。

sample.com
| .htaccess
| index.html
|- blog
 | index.php
 | post1.html

記述例

# RewriteEngine を起動
RewriteEngine On

# ベースディレクトリはsample.com/ (ファイルが配置されているディレクトリ)

# ベースをsample.com/blog/ に変える
RewiteBase /blog

RewriteRule ディレクティブ

RewriteRule ディレクティブは、URL の書き換えを行うディレクティブ。URLを書き換えや、別のURLに移動(リダイレクト)させることでアクセスされたリソースに対してWebサーバの挙動を制御できる。

RewiteRuleディレクティブでは、条件に一致するURL(1つめ)から置換後のURL(2つめ)に書き換えてwebサーバー内で処理を行う。3つめのフラグを用いて柔軟な制御が可能。

# RewriteRule 条件 置換文字列 [フラグ]
RewriteRule sample1.html sample2.html [L]

フラグについては次の記事内を参照します
https://murashun.jp/blog/20141229-23.html

以下の例では、index1.htmlにアクセスしたら最終的にindex3.htmlに移行する。

# index1.html → index2.html → index3.html
RewriteRule index1.html index2.html
RewriteRule index2.html index3.html

以下の例では、無限ループを引き起こし、500 Internal Server Errorとなる。
書き換え先で再度RewirteRuleが実行されるため。

# index1.html → index2.html → index1.html → ...
RewriteRule index1.html index2.html
RewriteRule index2.html index1.html

[L]フラグを指定すればいいはずだが、.htaccessでは[L]フラグは有効にならない。

# index1.html → index2.html に書き換わった時点で終了しない
RewriteRule index1.html index2.html [L]
RewriteRule index2.html index3.html [L]

そのため、RewriteCondを使用して無限ループを防ぐ。

RewriteCond ディレクティブ

RewriteCond ディレクティブは、RewriteRule ディレクティブの書き換えルールの条件を定義できる。本ディレクティブは、RewriteRule ディレクティブの前に 1 つ以上設置できる。複数設置する場合は、オプションによって OR 条件にするか選択できる。オプションを省略した場合は、AND 条件として処理される。本ディレクティブの条件を満たした場合、直後の RewriteRule ディレクティブの書き換えが行われる。条件を満たさない場合は、直後の RewriteRule ディレクティブが実行されないため、無限ループを防ぐ方法として有効。

# RewriteCond テスト文字列 条件 オプション
RewriteCond %{HTTP_HOST} ^(www\.)?murashun\.sakura\.ne\.jp$ [NC]
# RewriteRule 条件 置換文字列 [フラグ]
RewriteRule .* http://murashun.jp%{REQUEST_URI} [R=301,L]

HTTPリクエストヘッダの情報は “%{環境変数名}" と指定することで RewriteCond で利用できる。