【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 パターン 置換対象
Warning: count(): Parameter must be an array or an object that implements Countable in /home/yskymk/www/000web/ysklog/mod-rewrite/wp-includes/class-wp-comment-query.php on line 405
コメント
まだコメントはありません。