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

投稿者 : OSCA

 本連載では、これから数回に渡り Apache Rewrite の設定について解説していきますが、その前にどうしても知っておくべき事があります。 これを知らないと設定でハマってしまいますので、本稿を読んでから次のステップに進んでください。

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

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

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

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アプリの作成に力を入れています。 個人として何か一つでも世の中の多くの人に使ってもらえるアプリを作ろうと日々奮闘中です。
@engineer_osca