RewriteRule全転送条件の指定比較(ルートディレクトリ)
mod_rewriteのRewriteRuleに対して指定する一致条件の指定においては、
紹介されているコードによって様々です。
特にすべてのURLを一律転送を行うような場合には、
一見してどの指定を行っても問題なく転送されるはずです。
ここでは微妙な違いによるリダイレクトに関しての動作を検証しています。
RewriteRuleに対しての「すべて」指定の例
RewriteRuleに対して要求パスのすべてに一致するという条件指定には、
様々な記述がみられます。
そうした指定方法のズレと挙動についてご紹介します。
ここではドメインルートに対して配置した.htaccessファイルに指定した、
URL転送の例でご紹介します。
サブディレクトリに対して配置した例は以下でご紹介しています。
検証パターンと転送の動作結果
それぞれの記述によってすべてのURLを転送する条件として、
転送が行われるかを検証しています。
RewriteRule のURL条件に指定した記述を「条件記述」としています。
ルートディレクトリに配置した.htaccessからの転送結果
パターン | 条件 記述 |
要求パス | 転送 可否 |
---|---|---|---|
キャレット | ^ | / | 〇 |
ドット | . | / | × |
ドットアスタ | .* | / | 〇 |
ダラー | $ | / | 〇 |
キャレットドットアスタダラー | ^.*$ | / | 〇 |
キャレットドットアスタダラー・バケット変数なし | ^(.*)$ | / | 〇 |
キャレットドットアスタダラー・バケット変数あり | ^(.*)$と$1 | / | 〇 |
2014/12/16追記
以下のパターンを追記します。
パターン | 条件 記述 |
要求パス | 転送 可否 |
---|---|---|---|
キャレットダラー | ^$ | / | 〇 |
^ (キャレット・カレット)によるURL指定
「^」はRewriteRuleおける正規表現では「要求パスの最初」を意味しています。
この場合、要求のパスに関わらずすべての条件に一致することが確認できます。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule ^ http://redirect.trce.info/root-caret/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^ http://redirect.trce.info/root-caret/ [R=301,L] </IfModule> |
転送元URL
転送先URL
正しく転送されます
http://redirect.trce.info/root-caret/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-caret.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-caret/
. (ドット)によるURL指定・ルート
「.」はRewriteRuleおける正規表現では「任意の1文字」を意味しています。
この場合、要求のパスの「何かしらの1文字」にマッチするのか、
「何かしら1文字があれば」マッチするのかが確認しておきたい点になります。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule . http://redirect.trce.info/root-dot/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule . http://redirect.trce.info/root-dot/ [R=301,L] </IfModule> |
転送元URL
転送先URL
この場合は意図した転送がされません。
これはおそらくサブディレクトリ内に配置した.htaccessで指定し、
要求パスが「/」となっている場合でも「任意の1文字」と「/」ではマッチングしないようです。
2014/12/17追記・訂正
このURLが転送されない挙動は、
「http://root-dot.trce.info/」へのアクセスが行われた際に、
要求先URLは「空文字(/ではなく)」が要求されます。
空文字にマッチさせるには「^$」による判定が一般的で、
「.」による任意の1文字には当然ながらマッチしません。
その為、この挙動は正しい挙動になります。
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
この場合、転送されませんので転送元ページのレスポンスになっています。
. (ドット)によるURL指定・ルートRewriteBaseなし
別のサイトで「.」は1文字一致でURL転送がされるという記述を見つけ、
こうした検証を行っているのですが、どうにも「.」は一致扱いにならない模様です。
いや、それがどうとかってことではなく、
この「.」がそんなマルチ文字な利用方法として利用できるのかと言う点で疑問だったので。
そこで気になったのが、
これまでの検証で利用してきた
「RewriteBase /」の記述部分の存在(影響はないと思うのだけれども)
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule . http://redirect.trce.info/root-redirect/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule . http://redirect.trce.info/root-redirect/ [R=301,L] </IfModule> |
転送元URL
http://rootredirect.trce.info/
転送先URL
この場合でも意図した転送がされませんでした。
たぶん「.」で全パターン一致には利用できないと思う。。。
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
この場合、転送されませんので転送元ページのレスポンスになっています。
.* (ドット・アスタリスク)によるURL指定
一覧に戻る 「.*」はRewriteRuleおける正規表現では 「任意の1文字+複数回の繰り返し」を意味しています。 この場合は何かしらの要求パスのすべてに一致することが確認できます。 .htaccessに対してのRewriteRule指定に以下のように記載します。 RewriteRule .* http://redirect.trce.info/root-dota/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule .* http://redirect.trce.info/root-dota/ [R=301,L] </IfModule> |
転送元URL
転送先URL
正しく転送されます
http://redirect.trce.info/root-dota/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-dot-a.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-dota/
$ (ダラー)によるURL指定
「$」はRewriteRuleおける正規表現では「要求パスの最後」を意味しています。
この場合、要求のパスに関わらずすべての条件に一致することが確認できます。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule $ http://redirect.trce.info/root-dollar/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule $ http://redirect.trce.info/root-dollar/ [R=301,L] </IfModule> |
転送元URL
転送先URL
正しく転送されます
http://redirect.trce.info/root-dollar/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-dollar.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-dollar/
^.*$ (キャレット・ドット・アスタリスク・ダラー)によるURL指定
「^.*$」はRewriteRuleおける正規表現では、
「要求パスの最初+任意の1文字+複数回の繰り返し+要求パスの最初」を意味しています。
この場合、要求のパスに関わらずすべての条件に一致することが確認できます。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule ^.*$ http://redirect.trce.info/root-caretdad/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^.*$ http://redirect.trce.info/root-caretdad/ [R=301,L] </IfModule> |
転送元URL
http://root-caret-dad.trce.info/
転送先URL
正しく転送されます
http://redirect.trce.info/root-caretdad/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-caret-dad.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-caretdad/
^(.*)$ (キャレット・ドット・アスタリスク・ダラー・バケット)によるURL指定・変数なし
この場合は「^.*$」と同じ条件の指定になりますが、
()内の要求パスを転送先URLで利用しない場合には、 通常、括弧は必要ありませんが、
括弧があっても問題なく転送されることが確認できます。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule ^(.*)$ http://redirect.trce.info/root-caretdadb/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^(.*)$ http://redirect.trce.info/root-caretdadb/ [R=301,L] </IfModule> |
転送元URL
http://root-caret-dadb.trce.info/
転送先URL
正しく転送されます
http://redirect.trce.info/root-caretdadb/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-caret-dadb.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-caretdadb/
^(.*)$ (キャレット・ドット・アスタリスク・ダラー・バケット)によるURL指定・変数あり
この場合は「^(.*)$」と同じ条件の指定で転送先パスの指定に、
()内の要求パスを付与する設定です。
この転送先指定方法が良く利用される記述かと思います。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule ^(.*)$ http://redirect.trce.info/root-caretdadbv/$1 [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^(.*)$ http://redirect.trce.info/root-caretdadbv/$1 [R=301,L] </IfModule> |
転送元URL
http://root-caret-dadbv.trce.info/
転送先URL
正しく転送されます
http://redirect.trce.info/root-caretdadbv/
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
このままではパスがそのまま転送されているだけなので、
さらにサブディレクトリの指定やファイル名指定などを行ってパスの付与を確認します。
指定したURLで条件一致以降のパスが、
転送先にも付与されて転送が行われているのが確認できます。
http://root-caret-dadbv.trce.info/index.php
転送先 ==> http://redirect.trce.info/index.php
http://root-caret-dadbv.trce.info/suddir/index.php
転送先==> http://redirect.trce.info/suddir/index.php
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
※この場合は変数化して付与していますのでサブディレクトリへ転送されます。
http://root-caret-dadbv.trce.info/111/
転送先 ⇒ http://redirect.trce.info/root-caretdadbv/111/
2014/12/16追記
^$ (キャレット・ダラー)によるURL指定
この場合は「^$」とによる指定で転送先パスの指定にて全転送を行う例です。
.htaccessに対してのRewriteRule指定に以下のように記載します。
RewriteRule ^$ http://redirect.trce.info/r-caretdollar/ [R=301,L]
.htaccessによる指定
.htaccessは以下のように指定されています。
1 2 3 4 5 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^$ http://redirect.trce.info/r-caretdollar/ [R=301,L] </IfModule> |
転送元URL
http://root-caretdollar.trce.info/
転送先URL
http://redirect.trce.info/root-caretdollar/
正しく転送されます
cURLによる確認
cURLによるアクセス結果は以下のようになります。
エラーが発生しました。後でもう一度やり直してください。 |
正しく301転送されています。
2014/12/16追記
尚、この指定はサブディレクトリなどにアクセスした際には有効になりません。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。
http://root-caretdollar.trce.info/111/
転送は行われません(http://root-caretdollar.trce.info/111/)
この挙動はサブディレクトリに対して、
「^$」指定による.htaccessを指定した場合と同じ挙動です。
ルートディレクトリに配置した.htaccessでも「^$」指定時には、
サブディレクトリへのアクセスは対象に含まれないことが分かります。
サブディレクトリによる検証結果は以下で紹介しています。
さいごに
このようにして、すべてのアクセスにマッチさせたURL転送では、
ネット上で見かける様々な記述は、どれも動作としては満たしていることが分かります。
この辺の微妙な記述の違いがあっても、
URL転送が行われる点が、理解を難しくしている部分かもしれません。
ちょっと複雑なURL転送を行う際にはこうした記述の方法のブレを、
自分自身で理解しておく必要があるでしょう。
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に承認されライセンスされています。
公開日:
最終更新日:2014/12/17