RewriteRuleで$0変数の利用(ルート・サブディレクトリ差異)
一般的にmod_rewriteを利用してRewriteRuleに記載するパターンとして、
「RewriteRule ^(.*)$…$1」の組み合わせが利用されます。
しかし変数化の必要もなく「$0」が利用できるとのことなので検証します。
結果、$0でも問題なく要求パスの置換URL側への挿入が可能です。
RewriteRuleで$0変数の利用
「$0」確かにどこかでみかけたような記憶はあるのですが、
紹介されている大半が「RewriteRule ^(.*)$…$1」と$1が利用されています。
ここでは、$0が利用できることを確認します。
サブディレクトリ配下の場合
http://q-modrewrite.trce.info/dollar0/.htaccess には以下のように記述しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* http://redirect.trce.info/$0 [R=302,L] </IfModule> |
RewriteRule .* http://redirect.trce.info/$0 [R=302,L]
上記のとおり「(.*)」ではなく「.*」として記述していますので、
要求URLの変数化を行っていません。
実際のアクセス確認
以下のサブディレクトリにアクセスし、
要求パスが転送先に引き継がれるかを確認します。
http://q-modrewrite.trce.info/dollar0/dollar0_subdir/
転送先 ⇒ http://redirect.trce.info/dollar0_subdir/
http://q-modrewrite.trce.info/dollar0/
転送先 ⇒ http://redirect.trce.info/
しっかり、要求パス部分が引き継がれて転送されています。
が、要求パスは本来「/dollar0/dollar0_subdir/」であったはずです。
しかし、引き継がれているパスは「/dollar0_subdir/」部分のみになっています。
.htaccessは「http://q-modrewrite.trce.info/dollar0/.htaccess」に対して、
配置していますので、この場合.htaccessの配置された
ディレクトリ配下のサブディレクトリパスのみが引き継がれます。
この形の場合、冒頭のスラッシュ「/」が付いてこないんですね・・・。
.htaccessは最下層ディレクトリのものが利用されますので、
配置されたディレクトリよりも上のディレクトリ情報は
一切見ていないということなのかもしれません。
この要求パスの戻り値って、常識なんだろうか・・・。
今まで気づいてなかったけど。
ちなみに、一般的な記述「(.*)….$1」でも同じ結果が得られます。
http://q-modrewrite.trce.info/dollar1/dollar1_subdir/
転送先 ⇒ http://redirect.trce.info/dollar1_subdir/
http://q-modrewrite.trce.info/dollar1/
転送先 ⇒ http://redirect.trce.info/
挙動が気持ち悪かったので、ルートでも試しときます。
ルートディレクトリの場合
ドメインルートに配置した.htaccessでの挙動を検証します。
配置している.htaccessは同じです。
http://dollar0-val.trce.info/.htaccess
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* http://redirect.trce.info/$0 [R=302,L] </IfModule> |
実際のアクセス確認
以下のサブディレクトリにアクセスし、
要求パスが転送先に引き継がれるかを確認します。
転送先 ⇒ http://redirect.trce.info/
http://dollar0-val.trce.info/dollar0/
転送先 ⇒ http://redirect.trce.info/dollar0/
http://dollar0-val.trce.info/dollar0_subdir/
転送先 ⇒ http://redirect.trce.info/dollar0_subdir/
http://dollar0-val.trce.info/dollar0/dollar0_subdir/
転送先 ⇒ http://redirect.trce.info/dollar0/dollar0_subdir/
サブディレクトリの時と挙動は全く同じと言えます。
しかし、ドメインルートなどに配置した場合、
配置した場所が「/」で上位ディレクトリもないことから、
この上位ディレクトリ部分が要求パスに含まれてこないことには
気づかないよなと感じますね。
さいごに
こうして$0が利用できることが分かれば、
「(.*) $1」でも「.* $0」でもどちらでもいいと言えます。
なんとなく、(.*)のようにおまじないで書いちゃう気もしますが。
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に承認されライセンスされています。
公開日: