ApacheのRewriteを設定する前に知っておくべきこと

これから数回に渡り Apache Rewrite の設定について説明していきますが、その前に知っておくべき事がありますので説明します。 これを知らないと設定でハマってしまうことでしょう。

コンテキストの種類毎に正規表現の開始が異なる

Apache の設定では Directory コンテキスト、VirtualHost コンテキストなどのコンテキストがありますが、この種類によって Rewrite に記述する正規表現の書き方が違います。 この事は本家の「RewriteRule Directive – What is matched?」に記載がありますが、英語で書かれているためここで改めて説明しようと思います。

日本語に訳すと、こんなことが書かれています。(かなり捻じ曲げて訳してますが…)

  • “VirtualHost”コンテキストの中では、URLのホストとポートの後からクエリ文字列の前までをパターンマッチさせます。 (e.g. “/app1/index.html”).
  • “Directory”コンテキストと .htaccess の中では、URLやサーバー名やディレクトリ等のプレフィックスが除去された後に、ファイルシステムパスでパターンマッチさせます。 (e.g. “app1/index.html” or “index.html”).

日本語訳もようわからん感じで申し訳ないですが、簡単に理解すると

  • VirtualHost コンテキスト内 : URLのパス部分がマッチ対象 (e.g. “/app1/index.html”)
  • Directory コンテキスト or .htaccess : ディレクトリからの相対パス (e.g. “app/index.html”)

以上より、大きい違いとして正規表現の先頭に 「/」を含むか否かが違うことに注意が必要です。 このことを知らないで設定に挑んだ場合「パスは絶対あってるはずなのにマッチしてくれない!」と悩み続けることになってしまうかもしれませんね。

# VirtualHost コンテキストの場合
RewriteRule ^/hoge/(.*) http://www.yahoo.co.jp [R=301,L]

# Directory コンテキスト or .htaccess の場合
RewriteRule ^hoge/(.*) http://www.yahoo.co.jp [R=301,L]

さて上記について、どっちがどっちだか覚えられますか? VirtualHost コンテキストの場合「/」は必要でしたか? と「どっちだっけ」になってしまうと思いますので以下のように記述する工夫をすると「どっちだっけ」が分からなくても良くなりますよ。

RewriteRule ^/?hoge/(.*) http://www.yahoo.co.jp [R=301,L]

このように正規表現の最初の「/」の後に「?」を付けます。「?」は「0個か1個あることを示す」わけですから、「/」があってもなくてもどちらの場合にもマッチするというわけです。

おわりに

これで Apache Rewrite の設定でハマる事が一つ減ったと思います。 今まで「ホームページに書いてある通りにコピペしたのに有効にならない」という経験がある方は、もしかしたら上記が原因だったかもしれませんね。

さて、引き続き連載をご覧下さい。

著者 : OSCA

OSCA

 初級WEBエンジニアです。最近は Android, iOS, WEBアプリの作成に力を入れています。 個人として何か一つでも世の中の多くの人に使ってもらえるアプリを作ろうと日々奮闘中です。