mod_rewrite(RewriteRule)で指定文字数にマッチングリダイレクト
外部のブログなどからリダイレクトを行う際に、
YYYYMMDD形式を含むようなURLをWordPress形式の
YYYY/MM/DD/などのディレクトリ形式に
リダイレクトさせたい場合に利用するのが指定文字数の条件判定です。
ここでは条件判定に利用できるmod_rewrite(RewriteRule)パターン例の検証を行います。
mod_rewrite(RewriteRule)による条件判定
パターンマッチする条件は以下の例でご紹介します。
パターン | 要求URL | 転送先URL |
---|---|---|
.* | /n-modrewrite/mrrr/dot-asta/blog-date-20141127.html | http://redirect.trce.info/num/static/ |
.{8} | /n-modrewrite/mrrr/dot-8/blog-date-20141127.html | http://redirect.trce.info/num/dot-8/ |
.{4}.{2}.{2} | /n-modrewrite/mrrr/dot-422/blog-date-20141127.html | http://redirect.trce.info/num/dot-422/ |
[0-9]{8} | /n-modrewrite/mrrr/0to9-8/blog-date-20141127.html | http://redirect.trce.info/num/0to9-4to8/ |
.{4,8} | /n-modrewrite/mrrr/dot-4to8/blog-date-20141127.html | http://redirect.trce.info/num/dot-4to8/ |
[0-9]{4,8} | /n-modrewrite/mrrr/0to9-4to8/blog-date-20141127.html | http://redirect.trce.info/num/0to9-4to8/ |
[0-9]{4}[0-9]{2}[0-9]{2} | /n-modrewrite/mrrr/0to9-422/blog-date-20141127.html | http://redirect.trce.info/num/0to9-4to8/ |
検証と.htaccess設定
以下の検証では、転送先URLは便宜上固定としています。
検証の最後には動的に変数化してURLを生成する例をご紹介しています。
URL固定によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-20141127\.html http://redirect.trce.info/num/static/2014/11/27/ [R=302,L]
http://n-modrewrite.trce.info/mrrr/static/blog-date-20141127.html
この場合、日付に当たる「20141127」部分が「20141127」と
一致した場合のみに転送が行われる指定を行っています。
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
「.*」によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-.*\.html http://redirect.trce.info/num/dot-asta/2014/11/27/ [R=302,L]
この「.*」による条件指定は「任意の1文字+0回以上の繰り返し」を示しています。
よって、日付部分が条件に該当しています。
http://n-modrewrite.trce.info/mrrr/dot-asta/blog-date-20141127.html
尚「0回以上の任意の1文字」は空文字でも含まれますので、以下も対象になります。
http://n-modrewrite.trce.info/mrrr/dot-asta/blog-date-.html
http://n-modrewrite.trce.info/mrrr/dot-asta/blog-date-abcdefghijklmnopqrstuvwxyz.html
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「.{8}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-.{8}\.html http://redirect.trce.info/num/dot-8/2014/11/27/ [R=302,L]
この「.{8}」は「*」とは異なって、一致する回数分の繰り返しを示しています。
その為「任意の1文字+8回繰り返し」を示しています。
要は8文字(8byte)が挿入された場合のみが該当します。YYYYMMDD=8文字(8byte)
http://n-modrewrite.trce.info/dot-8/blog-date-20141127.html
尚、任意の8文字ですので以下のようなパターンでもマッチします。
http://n-modrewrite.trce.info/mrrr/dot-8/blog-date-12345678.html
http://n-modrewrite.trce.info/mrrr/dot-8/blog-date-redirect.html
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「.{4}.{2}.{2}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-.{4}.{2}.{2}\.html http://redirect.trce.info/num/dot-422/2014/11/27/ [R=302,L]
この「.{4}.{2}.{2}」は「.{8}」を細かな文字数のフォーマットにしているだけです。
判定条件は同じになりますが、このような記述方法を利用することで、
以下のように変数化する場合に利用できます。
RedirectMatch 302 /blog-date-(.{4})(.{2})(.{2})\.html http://redirect.trce.info/num/dot-422/$1/$2/$3/
この場合も「任意の1文字+8回繰り返し」を示しています。
http://n-modrewrite.trce.info/mrrr/dot-422/blog-date-20141127.html
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「[0-9]{8}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-[0-9]{8}\.html http://redirect.trce.info/num/0to9-8/2014/11/27/ [R=302,L]
この「[0-9]{8}」は「.{8}」の条件判定で「任意の1文字」を「0から9の数字」に限定します。
かつ、文字数を8文字(8byte)としています。
http://n-modrewrite.trce.info/mrrr/0to9-8/blog-date-20141127.html
以下のような場合も同じように転送されます。
http://n-modrewrite.trce.info/mrrr/0to9-8/blog-date-12345678.html
しかし、数字ではないこの場合は転送されません。
http://n-modrewrite.trce.info/mrrr/0to9-8/blog-date-redirect.html (転送不可404表示)
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「.{4,8}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-.{4,8}\.html http://redirect.trce.info/num/dot-4to8/2014/11/27/ [R=302,L]
この「.{4,8}」は「任意の1文字」を「4~8文字(4-8byte)」に限定しています。
http://n-modrewrite.trce.info/mrrr/dot-4to8/blog-date-20141127.html
この場合は以下のようなパターンでも転送されます。
http://n-modrewrite.trce.info/mrrr/dot-4to8/blog-date-201411.html
http://n-modrewrite.trce.info/mrrr/dot-4to8/blog-date-2014.html
http://n-modrewrite.trce.info/mrrr/dot-4to8/blog-date-year.html
http://n-modrewrite.trce.info/mrrr/dot-4to8/blog-date-newyear.html
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「[0-9]{4,8}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-[0-9]{4,8}\.html http://redirect.trce.info/num/0to9-4to8/2014/11/27/ [R=302,L]
この「[0-9]{4,8}」は「任意の1文字」を「4~8文字(4-8byte)」に限定し、
かつ「0~9の数字」のみに限定しています。
http://n-modrewrite.trce.info/mrrr/0to9-4to8/blog-date-20141127.html
この場合も以下のようなパターンでも転送されます。
http://n-modrewrite.trce.info/mrrr/0to9-4to8/blog-date-201411.html
http://n-modrewrite.trce.info/mrrr/0to9-4to8/blog-date-2014.html
しかし数字以外では転送されません。
http://n-modrewrite.trce.info/mrrr/0to9-4to8/blog-date-year.html (転送不可404)
http://n-modrewrite.trce.info/mrrr/0to9-4to8/blog-date-newyear.html (転送不可404)
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
「[0-9]{4}[0-9]{2}[0-9]{2}によるマッチング
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-[0-9]{4}[0-9]{2}[0-9]{2}\.html http://redirect.trce.info/num/dot-422/2014/11/27/ [R=302,L]
この「[0-9]{4}[0-9]{2}[0-9]{2}」は「.{4}.{2}.{2}」の条件を
さらに「0~9の数字」のみに限定しています。
この場合、4+2+2桁の数字になりますので、8文字(8byte)に制限されています。
http://n-modrewrite.trce.info/mrrr/0to9-422/blog-date-20141127.html
このパターンを利用すると、後述する実例のように利用ができます。
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
その他の記述例
●Redirect Match | ●RewriteCond |
実例と.htaccess設定
.htaccessには以下のように記述しています。
これは特に正規表現を利用せず、1対1対応でURL転送を行う例です。
エラーが発生しました。後でもう一度やり直してください。 |
この指定によって以下のように解釈されます。
説明
RewriteRule ^blog-date-([0-9]{4})([0-9]{2})([0-9]{2})\.html http://redirect.trce.info/num/solution/$1/$2/$3/ [R=302,L]
この「[0-9]{4}[0-9]{2}[0-9]{2}」を実例で紹介すると、
それぞれを括弧で囲み「([0-9]{4})([0-9]{2})([0-9]{2})」指定することで、
置換文字列へそれぞれの数字を引き継がせることができます。
これによって、
http://n-modrewrite.trce.info/mrrr/solution/blog-date-20141127.html へのアクセス要求が、
http://n-modrewrite.trce.info/num/solution/2014/11/27/ へと転送されることになります。
サンプルではこの日付のみですが、
要求された日付によって、転送先のURLを動的にすることが可能です。
転送と動作確認
URLにアクセスすると、転送先に正しく転送されるのが確認できます。
さいごに
mod_rewriteのRewriteCondを利用した条件判定は、
サイトでもよく見かけることと思います。
しかしいざ自分で書いてみると動かなかったりと、億劫な作業ではないでしょうか。
しかし、大抵は単純ミスであることが多いものです。
動かないと思ったら、まずは単純なパターンを試し、
徐々に複雑な条件で記載していくと、条件の切り分けが簡単になります。
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に承認されライセンスされています。
公開日: