頑張らない!でも諦めない!必死にならずにええかげん

RewriteRule全転送条件の指定比較(サブディレクトリ)

mod_rewriteのRewriteRuleに対して指定する一致条件の指定においては、
紹介されているコードによって様々です。
特にすべてのURLを一律転送を行うような場合には、
一見してどの指定を行っても問題なく転送されるはずです。
ここでは微妙な違いによるリダイレクトに関しての動作を検証しています。

 

RewriteRuleに対しての「すべて」指定の例

RewriteRuleに対して要求パスのすべてに一致するという条件指定には、
様々な記述がみられます。

そうした指定方法のズレと挙動についてご紹介します。

ここではサブディレクトリに対して個々に配置した.htaccessファイルに指定した、
URL転送の例でご紹介します。

別途、ドメインルートに配置した転送例は以下でご紹介しています。

 

検証パターンと転送の動作結果

それぞれの記述によってすべてのURLを転送する条件として、
転送が行われるかを検証しています。

RewriteRule のURL条件に指定した記述を「条件記述」としています。

 

サブディレクトリに配置した.htaccessからの転送結果 

パターン 条件
記述
要求パス 転送
可否
キャレット ^ /rule/caret/
ドット . /rule/dot/ ×
ドットアスタ .* /rule/dot-asta/
ダラー $ /rule/dollar/
キャレットドットアスタダラー ^.*$ /rule/caret-dot-asta-dollar/
キャレットドットアスタダラー・バケット変数なし ^(.*)$ /rule/caret-dot-asta-dollar-brackets/
キャレットドットアスタダラー・バケット変数あり ^(.*)$と$1 /rule/caret-dot-asta-dollar-brackets-val/

2014/12/16追記

以下のパターンを追記します。

パターン 条件
記述
要求パス 転送
可否
キャレットダラー ^$ /rule/caret-dollar/

 

^ (キャレット・カレット)によるURL指定

一覧に戻る

「^」はRewriteRuleおける正規表現では「要求パスの最初」を意味しています。
この場合、要求のパスに関わらずすべての条件に一致することが確認できます。

.htaccessに対してのRewriteRule指定に以下のように記載します。

RewriteRule ^ http://redirect.trce.info/r-caret/ [R=301,L]

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/caret/

転送先URL

正しく転送されます

http://redirect.trce.info/r-caret/

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

正しく301転送されています。   

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際にも有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/caret/111/

転送先 ⇒ http://redirect.trce.info/r-caret/

 

. (ドット)によるURL指定・サブディレクトリ

一覧に戻る

「.」はRewriteRuleおける正規表現では「任意の1文字」を意味しています。

この場合、要求のパスの「何かしらの1文字」にマッチするのか、

「何かしら1文字があれば」マッチするのかが確認しておきたい点になります。

  .htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule . http://redirect.trce.info/r-dot/ [R=301,L]       

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/dot/

転送先URL

この場合は意図した転送がされません。

これはおそらくサブディレクトリ内に配置した.htaccessで指定し、
要求パスも「/rule/dot/」となっている為と思われます。

 

その後、ドメインルート(要求パスが「/」)の環境に同じように指定をしましたが、
思った転送結果にはなりませんでした。

 

その為「.」は「.*」としかマッチングの表現ができないのかを以下で詳細検証しました。

 

2014/12/17追記・訂正

このURLが転送されない挙動は、
「http://root-dot.trce.info/」へのアクセスが行われた際に、
要求先URLは「空文字(/ではなく)」が要求されます。

空文字にマッチさせるには「^$」による判定が一般的で、
「.」による任意の1文字には当然ながらマッチしません。

その為、この挙動は正しい挙動になります。

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

この場合、転送されませんので転送元ページのレスポンスになっています。  

 

.* (ドット・アスタリスク)によるURL指定

一覧に戻る

「.*」はRewriteRuleおける正規表現では

「任意の1文字+複数回の繰り返し」を意味しています。

この場合は何かしらの要求パスのすべてに一致することが確認できます。

.htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule .* http://redirect.trce.info/r-dot-asta/ [R=301,L]      

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/dot-asta/

転送先URL

正しく転送されます

http://redirect.trce.info/r-dot-asta/

 

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

正しく301転送されています。  

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際には有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/dot-asta/111/

転送先 ⇒ http://redirect.trce.info/r-dot-asta/

 

$ (ダラー)によるURL指定

一覧に戻る

「$」はRewriteRuleおける正規表現では「要求パスの最後」を意味しています。

この場合、要求のパスに関わらずすべての条件に一致することが確認できます。

.htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule $ http://redirect.trce.info/r-dollar/ [R=301,L]      

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/dollar/

転送先URL

正しく転送されます

http://redirect.trce.info/r-dollar/

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

正しく301転送されています。  

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際には有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/dollar/111/

転送先 ⇒ http://redirect.trce.info/r-dollar/

 

^.*$ (キャレット・ドット・アスタリスク・ダラー)によるURL指定

一覧に戻る

「^.*$」はRewriteRuleおける正規表現では、

「要求パスの最初+任意の1文字+複数回の繰り返し+要求パスの最初」を意味しています。

この場合、要求のパスに関わらずすべての条件に一致することが確認できます。

.htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule ^.*$ http://redirect.trce.info/r-caret-dot-asta-dollar/ [R=301,L]      

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar/

転送先URL

正しく転送されます

http://redirect.trce.info/r-caret-dot-asta-dollar/

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

正しく301転送されています。  

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際には有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar/111/

転送先 ⇒ http://redirect.trce.info/r-caret-dot-asta-dollar/

 

^(.*)$ (キャレット・ドット・アスタリスク・ダラー・バケット)によるURL指定・変数なし

一覧に戻る

この場合は「^.*$」と同じ条件の指定になりますが、

()内の要求パスを転送先URLで利用しない場合には、

通常、括弧は必要ありませんが、

括弧があっても問題なく転送されることが確認できます。  

.htaccessに対してのRewriteRule指定に以下のように記載します。

 RewriteRule ^(.*)$ http://redirect.trce.info/r-caret-dot-asta-dollar-brackets/ [R=301,L]      

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets/

転送先URL

正しく転送されます

http://redirect.trce.info/r-caret-dot-asta-dollar-brackets/

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

正しく301転送されています。  

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際には有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets/111/

転送先 ⇒ http://redirect.trce.info/r-caret-dot-asta-dollar-brackets/

 

^(.*)$ (キャレット・ドット・アスタリスク・ダラー・バケット)によるURL指定・変数あり

一覧に戻る

この場合は「^(.*)$」と同じ条件の指定で転送先パスの指定に、

()内の要求パスを付与する設定です。

この転送先指定方法が良く利用される記述かと思います。

.htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule ^(.*)$ http://redirect.trce.info/r-caret-dot-asta-dollar-brackets-val$1 [R=301,L]       

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets-val/

転送先URL

正しく転送されます

http://redirect.trce.info/r-caret-dot-asta-dollar-brackets-val/

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

2014/12/16追記

尚、この指定はサブディレクトリなどにアクセスした際には有効になります。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets-val/111/

転送先 ⇒ http://redirect.trce.info/r-caret-dot-asta-dollar-brackets-val/111/

 


 

このままではパスがそのまま転送されているだけなので、

さらにサブディレクトリの指定やファイル名指定などを行ってパスの付与を確認します。

指定したURLで条件一致以降のパスが、

転送先にも付与されて転送が行われているのが確認できます。

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets-val/index.php

転送先 ==> http://redirect.trce.info/r-caret-dot-asta-dollar-brackets-val/index.php

 

http://q-modrewrite.trce.info/rule/caret-dot-asta-dollar-brackets-val/suddir/index.php

転送先==> http://redirect.trce.info/r-caret-dot-asta-dollar-brackets-val/suddir/index.php  

 

 

2014/12/16追記

^$ (キャレット・ダラー)によるURL指定

一覧に戻る

この場合は「^$」とによる指定で転送先パスの指定にて全転送を行う例です。

.htaccessに対してのRewriteRule指定に以下のように記載します。

  RewriteRule ^$ http://redirect.trce.info/r-caretdollar/ [R=301,L]       

 

.htaccessによる指定

.htaccessは以下のように指定されています。

 

転送元URL

http://q-modrewrite.trce.info/rule/caret-dollar/

転送先URL

正しく転送されます

http://redirect.trce.info/r-caretdollar/

 

尚、この指定はサブディレクトリなどにアクセスした際には有効には有効になりません。
以下は転送元に実在するURLへのアクセスです。
「/111」ディレクトリには.htaccessファイルは配置していません。

http://q-modrewrite.trce.info/rule/caret-dollar/111/

転送は行われません(http://q-modrewrite.trce.info/rule/caret-dollar/111/)

 

cURLによる確認

cURLによるアクセス結果は以下のようになります。

問題なく転送が行われています。

この場合、要求パスに対して開始と終了が含まれていれば、
すべて転送となる挙動をみせます。

要求パスの中身が一切問われない点が少し困惑する部分かもしれません。

ただこの記述方法が「.*」とどのように違いがあるのかが、
現状では理解できていません。

 

ただ、Sakuraの公式ヘルプでは、
初期ドメインからのリダイレクトでは「.*」を選択しているにもかかわらず
スマートフォンアクセスの振り分けでわざわざ「^$」による条件指定を行っています。

mod_rewriteを使ったアクセス制御|さくらインターネット公式サポートサイト 

何かしらの違いがあるものとは思います。

継続して調べていきたいと思います。

2014/12/16追記

その後、サブディレクトリへのアクセスにおいて、
「^$」指定を行った転送の場合には、
サブディレクトリからの転送が行われないことが分かりました。

.htaccessを配置したディレクトリへのアクセスのみに制限したい場合などに、
この指定が利用できるように感じます。

 

この挙動はルートディレクトリに対して、
「^$」指定による.htaccessを指定した場合と同じ挙動でした。

ルートディレクトリによる検証結果は以下で紹介しています。

 

 

プロモーション(btm)

Google or AdMax Promotion (it)

さいごに

このようにして、すべてのアクセスにマッチさせたURL転送では、
ネット上で見かける様々な記述は、どれも動作としては満たしていることが分かります。

この辺の微妙な記述の違いがあっても、
URL転送が行われる点が、理解を難しくしている部分かもしれません。

ちょっと複雑なURL転送を行う際にはこうした記述の方法のブレを、
自分自身で理解しておく必要があるでしょう。


公開日:
最終更新日:2014/12/17

最後までお読みいただきありがとうございました。

ページ
すべて展開 | すべて省略

Rakuten Promotion

ブログ記事のご紹介
すべて展開 | すべて省略