RewriteRuleで%{REQUEST_URI}の使用
一般的にmod_rewriteを利用してRewriteRuleに記載するパターンとして、
「RewriteRule ^(.*)$…$1」の組み合わせが利用されます。
しかし変数化の必要もなく「%{REQUEST_URI}」が利用できるとのことなので検証します。
結果、ルートディレクトリであれば%{REQUEST_URI}の利用は、
ルートディレクトリに配置した.htaccessで利用したほうが良さそうです。
RewriteRuleで%{REQUEST_URI}サーバー変数の利用
リダイレクト転送に対して紹介されているサイトの多くが
「RewriteRule ^(.*)$…$1」と$1が利用されています。
ここでは、%{REQUEST_URI}が利用できることを確認します。
サブディレクトリ配下の場合
http://q-modrewrite.trce.info/request_uri/.htaccess には以下のように記述しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* http://redirect.trce.info%{REQUEST_URI} [R=302,L] </IfModule> |
RewriteRule .* http://redirect.trce.info%{REQUEST_URI} [R=302,L]
上記のとおり「(.*)」ではなく「.*」として記述していますので、
要求URLの変数化を行っていません。
実際のアクセス確認
以下のサブディレクトリにアクセスし、
要求パスが転送先に引き継がれるかを確認します。
http://q-modrewrite.trce.info/request_uri/request_uri_subdir/
転送先 ⇒ http://redirect.trce.info//request_uri/request_uri_subdir/ (404)
http://q-modrewrite.trce.info/request_uri/
転送先 ⇒ http://redirect.trce.info//request_uri/ (404)
引き継がれてはいるのですが、
このようなサブディレクトリに対して配置した場合のせいなのか、
%{REQUEST_URI} によって「/」が多く付与されてしまいます。
このままでは少し使いにくくて困りますね。
また挙動が気持ち悪かったので、ルートでも試しときます。
ルートディレクトリの場合
ドメインルートに配置した.htaccessでの挙動を検証します。
配置している.htaccessは同じです。
http://requesturi-val.trce.info/.htaccess
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* http://redirect.trce.info%{REQUEST_URI} [R=302,L] </IfModule> |
実際のアクセス確認
以下のサブディレクトリにアクセスし、
要求パスが転送先に引き継がれるかを確認します。
http://requesturi-val.trce.info/
転送先 ⇒ http://redirect.trce.info/
http://requesturi-val.trce.info/request_uri/
転送先 ⇒ http://redirect.trce.info/request_uri/
http://requesturi-val.trce.info/request_uri_subdir/
転送先 ⇒ http://redirect.trce.info/request_uri_subdir/
http://requesturi-val.trce.info/request_uri/request_uri_subdir/
転送先 ⇒ http://redirect.trce.info/request_uri/request_uri_subdir/
ルートディレクトリで%{REQUEST_URI}を利用する上では、
「/」が重複するようなことも発生せず、
変数化の必要もなく安心して転送を行うことができます。
さいごに
イメージとしてはどこに配置した.htaccessであっても、
要求パスはドメイン以降のURL部分に感じます。
しかし、%{REQUEST_URI}に格納されてくるパスの値は、
サブディレクトリでは上位のパス名が含まれてきていないように見受けられます。
これって、RewriteCond側で%{REQUEST_URI}を利用しても同じなんだろうか・・・。
そんな印象を受けたことはないんだけど。
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に承認されライセンスされています。
公開日: