Apache Rewrite 学習 : 第02回 正規表現を用いて転送する

投稿者 : OSCA

[PR] "出川哲朗の充電させてもらえませんか?"で登場したロケ地を紹介するファンサイト「あの場所へ行こう!」はこちら。

 前回は「URL個別に転送設定をする方法」を学びました。 今回は、下記の設定について学習します。

  • 全てのページへのアクセスを別のページへ転送する
  • 特定のディレクトリへのアクセスを別のページへ転送する

設定前の注意事項

 「Directory コンテキストや .htaccess で転送設定する場合」と「VirtualHost コンテキストで転送設定する場合」とで、検索条件の先頭に「^/」が必要な場合とそうでない場合とがあります。 どちらのディレクティブに設定しようとしているのかを意識してください。 詳しくは以前の記事「ApacheのRewriteを設定する前に知っておくべきこと」を参考にしてください。 本稿では、VirtualHost ディレクティブで転送設定する場合の記述をしています。 Directory ディレクティブや .htaccess に設定する場合は、「^/」の記述を変更して設定してください。

 また「正規表現に自信がない」という方は、正規表現と対象文字列がどのように一致しているかを簡単に試せる「正規表現チェッカー」を使ってみてください。

正規表現を用いた転送

(1) 全てのアクセス ⇒ http://www.google.co.jp

RewriteRule ^/(.*) http://www.google.co.jp [R=302,L]

(2) フォルダ「hoge」以下の全てのアクセス ⇒ http://www.google.co.jp

RewriteRule ^/hoge/(.*) http://www.google.co.jp [R=302,L]

(3) 拡張子を変換して転送 (HTML ⇒ PHP) (例: index.html ⇒ index.php)

RewriteRule ^/hoge/(.*).html$ /hoge/$1.php [R=302,L]

(1) は、ホームページへの全てのアクセスを Google に転送する例です。 ドット(.) は文字全てを、アスタリスク(*)は0文字以上の繰り返しを表しますので、アクセスされたパスが0文字以上(=実質全て)の場合に転送を行います。

(2) は、(1)と考え方は同じです。 アクセスされたパスが “/hoge/” で始まる場合に、Google に転送する設定です。

(3) は、HTMLファイルにアクセスされたら、PHPファイルへ転送する例です。 “$1” は変数で、正規表現のカッコ “()” で囲った部分の文字が入っているので、転送後パスの記述に利用することができる。

今回紹介したサンプルの注意点

「全てのアクセスをメンテナンス画面に転送したい」というような場合があると思います。 しかし、そんな時に注意が必要です。 以下はハマってしまう例です。

#ダメな設定例
RewriteRule ^/(.*) /maintenance.html [R=302,L]

このように設定してしまうと何がマズいのかと言えば、転送の無限ループが発生してしまうことです。 全てのアクセスを maintenance.html に転送していますが、転送先の maintenance.html も「全てのアクセス」に含まれてしまう為、また転送処理が起きてしまいリダイレクトの無限ループが発生してしまいます。

おわりに…

 今回は正規表現を用いてアクセスを転送する例を示しました。 次回からは更に詳しく正規表現やパラメータを利用した例を示していきたいと思います。

Apacheのトップへ戻る

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。 個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca