スポンサードリンク

【mod_rewrite】 RewriteCondとは?

ここではApacheのモジュール mod_rewriteのディレクティブの一つ「RewriteCond」について説明しています。

スポンサードリンク

RewriteCondとは?

「RewriteCond」は、mod_rewriteの構文の一つで、URL書き換えを行うルール条件を指定するものです。RewriteRuleの前に記述します。

RewriteCondがある場合、直後に記述されているRewriteRuleは、RewriteCondが指定するルール条件を満たさないと処理されません。

  • RewriteCondが指定するルール条件を満たす  →RewriteRuleが処理される
  • RewriteCondが指定するルール条件を満たさない→RewriteRuleは処理されない

書式

RewriteCond 対象文字列 条件パターン

・対象文字列は、条件パターンと照らし合わせる文字列です。サーバ変数などからデータを取得し、これを対象文字列にすることができます

・条件パターンは、対象文字列とマッチ(部分一致or全体一致)させるパターンを指定する部分です。正規表現を利用できます。

使用例

環境

環境を整理しておきます。

  • 「○○○.com」と「www.○○○.com」のルートディレクトリ
    /var/www/html/○○○/

「http://○○○.com/index.html」と「http://www.○○○.com/index.html」でアクセスがあった場合、両方ともルートディレクトリの「index.html」が出力されます。

RewriteCondの使い方

「www.○○○.com」を含むURLでアクセスがあった場合に「○○○.com」に正規化(リダイレクト)するmod_rewriteを書いてみたいと思います。

これは、以下を記述した「.htaccess」をルートディレクトリに設置すれば実現できます。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.○○○\.com$
RewriteRule ^(.*)$ http://○○○.com/$1 [R=301,L]

この場合、「http://www.○○○.com/~~~」というアクセスがあった場合、「http://○○○.com/~~~」にリダイレクト(正規化)されます。

解説

「http://www.○○○.com/~~~」でアクセスがあった場合、対象文字列部分の「%{HTTP_HOST}」は「www.○○○.com」となります(詳しくはサーバ変数を参照)。

これは、条件パターン部分の「^www\.○○○\.com$」とマッチします(「^」は行頭、「$」は行末、「\」はエスケープを表す正規表現)。

RewriteCondのルール条件がマッチするので、処理はRewriteRuleに移行します。

なお、初めから「http://○○○.com/~~~」でアクセスがあった場合、対象文字列部分の「%{HTTP_HOST}」は「○○○.com」となり、条件パターン部分の「^www\.○○○\.com$」とマッチしませんので、RewriteRuleは処理されません。

RewriteCondは直後のRewriteRuleの条件のみを指定する

次のようなmod_rewriteを記述したとします。

RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(www\.)?ysklog\.net
RewriteRule ^index\.html$ index2.html   ・・・①
RewriteRule ^index2\.html$ index3.html  ・・・②

この場合、リファラなしで「http://www.○○○.com/index.html」にアクセスがった場合、RewriteCondの条件を満たさないので、①は処理されません。

しかし、リファラなしで「http://www.○○○.com/index2.html」にアクセスがあった場合、②の処理によって「index3.html」に書き換えられます。

このようにRewriteCondは、直後のRewriteRuleの条件を指定できますが、それ以降のRewriteRuleとは無関係となります。

なお、参照元に「ysklog.net」を持って「http://www.○○○.com/index.html」にアクセスがあった場合、最終的に「index3.html」に書き換えられます(この詳細は「.htaccess」での設定時の注意点を参照)。

RewriteCondを複数記述する場合

RewriteCondを複数使う場合、暗黙に「AND」で繋がれます。

RewriteEngine on
RewriteCond 対象文字列A 条件パターンA   ・・・①
RewriteCond 対象文字列B 条件パターンB   ・・・②
RewriteCond 対象文字列C 条件パターンC   ・・・③
RewriteRule パターン 置換対象

すなわち、①と②と③のすべてのルール条件がマッチしないとRewriteRuleは処理されません。

なお、「OR」でつなぎたい場合は「[OR]」フラグで明示します。

RewriteEngine on
RewriteCond 対象文字列A 条件パターンA [OR]   ・・・①
RewriteCond 対象文字列B 条件パターンB [OR]   ・・・②
RewriteCond 対象文字列C 条件パターンC        ・・・③
RewriteRule パターン 置換対象

この場合、①か②か③のいずれかが条件マッチすればRewriteRuleが処理されます。

なお、[OR]フラグを使わない場合はこのように書きます。

RewriteEngine on

RewriteCond 対象文字列A 条件パターンA
RewriteRule パターン 置換対象

RewriteCond 対象文字列B 条件パターンB
RewriteRule パターン 置換対象

RewriteCond 対象文字列C 条件パターンC
RewriteRule パターン 置換対象

コメント

まだコメントはありません。

コメントフォーム
お名前
コメント