##mod_rewriteって分かりづらくない?
サイトの移転やhttpsリクエストページへのリダイレクトなどでmod_rewriteを使うことがありますが、
正直出番は多くない&みんなやりたいことが一緒なので、なんとなくネットで方法を調べたり、詳しい人に対応してもらっているケースが多いと思います。本来ならば、しっかりと理解してから対応すべきなのですが、独自の言い回しや、非常に多いオプションが難易度を上げているようにも感じます。ここらでちゃんと基本を理解しましょう。
##文法について
一見難しそうな文法ですが、見慣れない文言やオプションが多いだけで、記述の仕方はシンプルです。
mod_rewriteの基本的な文法
-
RewriteEngine on
:URL書き換えを宣言 -
RewriteBase
:基準となるパスを設定(今回は説明しない) -
RewriteOptions
:親子ディレクトリ間での影響範囲を設定(今回は説明しない) -
RewriteCond
:条件文を設定 -
RewriteRule
:指定したパターンでURLの書き換えを行う
RewriteEngine on|off
- URL書き換えを行う場合には必須
- URL書き換えの on | off を設定する
- offの場合は、URL書き換えが動作しない
- バーチャルホストには継承されないので、それぞれ設定する必要がある
RewriteCond
- ルールの条件設定を行う
- 書き方は
RewriteCond X Y
- XはYに一致する場合、の意
- RewriteRuleの前に記述
- 複数記述できる
- 設定した全ての条件にマッチした場合、指定したRewiteRuleが実行される
- サーバー情報やリクエスト情報を取得できる環境変数を使用できる
-
%{環境変数名}
で使用可能 - どんな環境変数があるかについてはこちらを参照
-
RewriteRule
- 書き換えの処理を実行する
- 書き方は
RewiteRule X Y
- 前述したRewriteCondとXがマッチした際、Yに書き換える、の意
- 書き換え内容は正規表現で指定
記述例
httpリクエストとhttpsにリダイレクトする
下記は、http://foo.jp/bar/dee
というリクエストがあった場合、httpsにリダイレクトする例です。
<ifModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</ifModule>
処理の内容を説明すると下記のようになります
- httpsで無い場合
- リクエストされたもの
http://foo.jp/bar/dee
の - %{HTTP_HOST}であるfoo.jpと
- %{REQUEST_URI}である/bar/deeを利用して
- [R]リダイレクトし
- [L]それ以降の処理は行わない
フラグの設定
上記例に[R]
とか[L]
が急に出てきて「うわ、めんどくせえ」ってなりますね。これらはフラグと呼ばれ、RewriteRuleの末尾につけます。役割としては、RewriteRuleを振る舞いを設定します。
このフラグは約20個あり、全部説明するのは困難なので、他の方が書いた記事に譲ります。
無効なURLがリクエストされた場合は、index.phpに書き換え
下記は、CMSなどでよくある設定です。
<Directory /var/www/foo.jp>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</Directory>
-
index.php
がリクエストされた場合、何もしないで終了 - 存在しないファイルがリクエストされた場合、次の条件へ
- 存在しないディレクトリがリクエストされた場合、次の条件へ
- 上記条件を満たすリクエストはindex.phpに書き換える
まーた-f
とか-d
とか出てきました。 これらは条件パターンと呼ばれるもので、左辺側に対して条件を指定しています。
勘の良い方は気づいたかもしれませんが、-f
はファイルを表し、-d
はディレクトリを表します。
それに否定を意味する!
を付け足し、ファイルが存在しない場合
、ディレクトリが存在しない場合
という意味を持たせています。
条件パターンについては他の方が書いた記事をご参照ください。
終わりに
mod_rewriteは奥が深いので、1つの記事で全てを説明するのは難しいですが、この記事で苦手意識を抱えている方の手助けになれば幸いです。
オプションが多く、敷居が高く感じられますが、一個一個は非常にシンプルな条件の塊です。怖がらずにどんどんチャレンジしていきましょう。