12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Gaiax GroupAdvent Calendar 2018

Day 23

雰囲気で書かないmod_rewrite

Last updated at Posted at 2018-12-22

##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つの記事で全てを説明するのは難しいですが、この記事で苦手意識を抱えている方の手助けになれば幸いです。
オプションが多く、敷居が高く感じられますが、一個一個は非常にシンプルな条件の塊です。怖がらずにどんどんチャレンジしていきましょう。

12
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?