mod_rewriteで変数(%1,$1)を併用する例と実際の動作
mod_rewriteを利用したURL転送では、
RewriteRule、RewriteCondの双方で条件判定を行うことができます。
また条件判定に利用した要求URLの一部を記憶させて、
置換後文字列に対して変数として再利用させることが可能です。
これによってパターンにマッチした文字列から動的にURL生成が行えます。
RewriteRule、RewriteCondで変数化した値を置換後文字列に利用するには、
「%1」「$1」などの記号を用いますが、当然この記号を併用することもできます。
ここでは、それぞれを併用した場合の例をご紹介します。
mod_rewriteで変数(%1,$1)を併用する例と実際の動作
置換後URLにて要求URLの一部文字列を流用する場合、
RewriteRuleにて要求URLの判定を行った場合は「$1」利用します。
RewriteCondにて要求URLの判定を行った場合は「%1」利用します。
mod_rewriteでURL転送を行う例は、
以下の投稿でそれぞれご紹介しました。
そうしたURL文字列を利用したURL置換は当然ですが併用することができます。
例として以下のように.htaccessに対して記載しています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/blog-date-([0-9]{4})[0-9]{2}[0-9]{2}\.html$ RewriteRule ^blog-date-[0-9]{4}([0-9]{2})([0-9]{2})\.html$ http://url-html.rensrv.com/%1/$1/$2 [R=302,L] </IfModule> |
上記の記述は以下のような意味になっています。
RewriteCond %{REQUEST_URI} ^/blog-date-([0-9]{4})[0-9]{2}[0-9]{2}\.html$
RewriteRule ^blog-date-[0-9]{4}([0-9]{2})([0-9]{2})\.html$ http://url-html.rensrv.com/%1/$1/$2 [R=302,L]
ここでは「/blog-date-YYYYMMDD.html」への要求があった場合に、
http://url-html.rensrv.com/YYYY/MM/DD へURL転送を行う例でご紹介します。
RewriteCond行の「%{REQUEST_URI}」部分は、
要求のあったURL文字列と判定を行うことを示しています。
ここでは「/blog-date-YYYYMMDD.html」への要求パスが得られます。
その要求パスと以下のパターンを比較しています。
「^/blog-date-([0-9]{4})[0-9]{2}[0-9]{2}\.html$」
またRewriteRule行では「RewriteRule 」に続いてマッチングパターンを
記述することでマッチングを行います。
以下のパターンでURL判定を行っています。
「^blog-date-[0-9]{4}([0-9]{2})([0-9]{2})\.html$ 」
それぞれの違いは括弧「()」「()」「()」の有無の違いだけです。
要求パスの頭に「/」の有無による違いがありますが、
この点については以前、以下でご紹介しています。
さて、要求パスの条件判定は全く同じものを設定し、
括弧「()」「()」「()」の位置によって、ここでは置換ルールを設定しています。
「http://url-html.rensrv.com/%1/$1/$2」
これによって、以下のように転送ルールが適用されます。
- () 内の文字は %1 に挿入されます。
- () 内の文字は $1 に挿入されます。
- () 内の文字は $2 に挿入されます。
こうした条件判定時に得た文字列を置換後文字列側に挿入し、
置換後URLを組み立てることができます。
実際の動作例は以下にアクセスすることで確認が行えます。
アクセスするとすぐに以下URLへ転送されます。
http://url-html.rensrv.com/2014/12/09
さいごに
実際、このような転送の記述は行わず、
どちらかのURL判定をおこなって「%」または「$」による変数指定を行うでしょう。
RewriteCondでは、要求されたURLを取得するサーバー変数
「%{REQUEST_URI}」だけでなく様々な変数が利用できます。
要求パスだけであれば、RewriteCond、RewriteRuleどちらでも記述できますが、
URLのクエリ文字列による判定とクエリ文字列の取得には、
RewriteCondによる記述が必要になります。
この場合は当然「%」によるクエリ文字列の変数化を利用します。
併せて要求パスの変数化を利用するような場合には、
「$」も併用することもあるでしょう。
こうした記述方法と挙動を理解したうえでmod_rewriteを活用していきたいものです。
Apache,Apache Hadoop,Apache Subversion,Hadoop,HDFS,HBase,Hive,Mahout,Pigは、
Apache Software Foundationの米国およびその他の国における登録商標または商標です。
ApacheソフトウェアはApache Software License (原文)および
Apache License, 2.0 (原文)に基づきOpen Source Initiativeに承認されライセンスされています。
公開日: