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

RewriteRuleによるディレクトリ判定例(サブディレクトリ)

RewriteRuleに指定した条件によってURLの置換を行うか否かの
条件指定を行うことができます。
ここではサブディレクトリに配置した.htaccessに対しての挙動を紹介します。
複雑な操作が行えるmod_rewriteによるURL転送ですが、
いざ思ったことをしようとすると旨く転送が行えなかったりもするものです。
そんな時には基本的な転送条件による挙動を見直しておくと、
複雑な操作を行う上のベースとなってくれるでしょう。

 

RewriteRuleによるディレクトリ判定例(サブディレクトリ)

ここではサブディレクトリに配置した.htaccessによるURL転送の
各ディレクトリに対してのURL転送について、
RewriteRuleに指定した各条件で挙動を確認しています。

 

設定パターン

以下のパターンでRewriteRuleに指定して、
ルートディレクトリからのURL転送の挙動を確認しています。

RewriteRule 確認URLパス 備考
/ /dir/ /directory/ /subdir/
「/」指定例 × 「/」が1文字存在
「^/?」指定例 「/」が0または1文字存在
「^/+」指定例 × × × × パスの開始が/と1回以上一致
「^/*」指定例 パスの開始が/と0回以上一致(全て)
「^.」指定例 × パスが空ではない
「^」指定例 開始文字がある(全て)
「$」指定例 終了文字がある(全て)
「^$」指定例 × × × パスが空である
「dir/」指定例 × × 「dir/」を含む
「^dir/」指定例 × × × 「dir/」で始まる
「^dir」指定例 × × 「dir」で始まる
「dir$」指定例 × × × × 「dir」で終わる

※便宜上ルートパスを「/」として表記していますが、
以下の検証においてルートパスでは要求パスが「空文字」として要求が行われます。

 

尚、ルートディレクトリに対して設置した.htaccessによるURL転送例と、
挙動は同じ結果になります。

 

あまり.htaccessに関して書かれているサイトでは、
当たり前だから省かれているのか、ディレクトリに配置した.htaccessでは、
配置したディレクトリ以下のURLパスが、RewriteRuleの判定条件に利用されます。

その為、ルートに配置した場合と挙動が同じになるわけですが、
以下のようなURLにて判定されることに注意が必要です。

例えば、http://d-modrewrite.trce.info/d-slash/dir/ に対してのアクセス要求があり、
.htaccessが、
http://d-modrewrite.trce.info/d-slash/.htaccessに配置されている場合です。

この場合、http://d-modrewrite.trce.info/d-slash/dir/ へのアクセスで、

RewriteRuleの判定では、「d-slash/dir/」による判定ではなく、
「dir/」にて判定が行われます。

 

またルートディレクトリ(.htaccessを配置したディレクトリ)であるかの判定は、

「/」を判定するのではなく、「空文字であるか」を判定することになります。
RewriteRuleでは「^$」による判定が便利です。

慣れていれば当たり前かもしれませんが、
この挙動を理解していないと意図した動作をしないと困惑することになります。

 

検証結果

以下では各ケースで動作確認しています。

実際に検証を行った環境もそのまま残していますので、
実際の転送挙動も確認することができます。

 

「/」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

転送の確認

このパターンではルートディレクトリへのアクセス時に、
RewriteRuleの条件指定において、
ルートである「/」がマッチングするかを検証しています。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-slash/ × http://d-modrewrite.trce.info/d-slash/
http://d-modrewrite.trce.info/d-slash/dir/ http://redirect.trce.info/d-slash/
http://d-modrewrite.trce.info/d-slash/directory/ http://redirect.trce.info/d-slash/
http://d-modrewrite.trce.info/d-slash/subdir/ http://redirect.trce.info/d-slash/

 

結果として、ルートディレクトリでは、
「/」はマッチングせず、サブディレクトリ以降のみでマッチングし転送が行われています。
「^」を指定していないことから、任意の場所に「/」が存在することで判定しています。

 

この判定だけで既に立証ができていますが、
ルートディレクトリへアクセスがあった場合には、

「/」がRewriteRuleの条件判定に利用されるわけではなく、
「(空文字)」へのアクセスとして要求されることが分かります。

 

「^/?」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンではスラッシュに対して「?」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。

「?」は正規表現では「直前のサブ式と 0 回または 1 回一致」ですので、
この場合開始位置の次の文字で、 「/」が0回または1回現れる場合にマッチングします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-slash-quest/ http://redirect.trce.info/d-caret-slash-quest/
http://d-modrewrite.trce.info/d-caret-slash-quest/dir/ http://redirect.trce.info/d-caret-slash-quest/
http://d-modrewrite.trce.info/d-caret-slash-quest/directory/ http://redirect.trce.info/d-caret-slash-quest/
http://d-modrewrite.trce.info/d-caret-slash-quest/subdir/ http://redirect.trce.info/d-caret-slash-quest/

この場合には「/」ではマッチングしなかった、
ルートディレクトリがマッチングしていますが、

これはすべてがスラッシュ0回扱いでマッチングしています。

この立証には次のパターンでわかります。

 

「^/+」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

転送の確認

このパターンではスラッシュに対して「+」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。

「+」は正規表現では「直前のサブ式と 1 回以上一致」ですので、
この場合開始位置の次の文字で、 「/」が少なくとも1回現れる場合にマッチングします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-slash-plus/ × http://d-modrewrite.trce.info/d-caret-slash-plus/
http://d-modrewrite.trce.info/d-caret-slash-plus/dir/ × http://d-modrewrite.trce.info/d-caret-slash-plus/dir/
http://d-modrewrite.trce.info/d-caret-slash-plus/directory/ × http://d-modrewrite.trce.info/d-caret-slash-plus/directory/
http://d-modrewrite.trce.info/d-caret-slash-plus/subdir/ × http://d-modrewrite.trce.info/d-caret-slash-plus/subdir/

 

この場合、すべての転送が行われなくなりました。
これは要求パスの開始文字の次の文字がどれもスラッシュではない為です。

それぞれの1文字目は以下になり、どれもスラッシュには一致していません。

 

「^/*」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンではスラッシュに対して「*」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。

「*」は正規表現では「直前のサブ式と 0 回以上一致」ですので、
この場合開始位置の次の文字で、
「/」が0回以上一致になりますので「/」ではなくでもマッチングします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-slash-asta/ http://redirect.trce.info/d-caret-slash-asta/
http://d-modrewrite.trce.info/d-caret-slash-asta/dir/ http://redirect.trce.info/d-caret-slash-asta/
http://d-modrewrite.trce.info/d-caret-slash-asta/directory/ http://redirect.trce.info/d-caret-slash-asta/
http://d-modrewrite.trce.info/d-caret-slash-asta/subdir/ http://redirect.trce.info/d-caret-slash-asta/

 

この場合、すべての転送が行われます。
ぶっちゃけ「/*」であろうと「.*」であろうと「*」を採用した時点で、
マッチングしていようと、していまいと関わらず、マッチング判定が得られます。

 

「^.」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは開始位置の次の文字に対して「.」条件を付与しています。
この場合、要求パスが空ではない場合にマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-dot/ × http://d-modrewrite.trce.info/d-caret-dot/
http://d-modrewrite.trce.info/d-caret-dot/dir/ http://redirect.trce.info/d-caret-dot/
http://d-modrewrite.trce.info/d-caret-dot/directory/ http://redirect.trce.info/d-caret-dot/
http://d-modrewrite.trce.info/d-caret-dot/subdir/ http://redirect.trce.info/d-caret-dot/

 

結果として、ルートディレクトリへの要求が空文字であることが分かります。
要求パスがルート以外への要求である場合に、
URL転送を行いたい場合に便利な判定条件です。

 

「^」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは要求パスの開始位置を示す「^」のみを指定しています。
この場合、実質なんでもマッチングします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret/ http://redirect.trce.info/d-caret/
http://d-modrewrite.trce.info/d-caret/dir/ http://redirect.trce.info/d-caret/
http://d-modrewrite.trce.info/d-caret/directory/ http://redirect.trce.info/d-caret/
http://d-modrewrite.trce.info/d-caret/subdir/ http://redirect.trce.info/d-caret/

 

結果として、ルートディレクトリへの要求が空文字でである場合も含め、
全ての要求にパスの開始文字が含まれていることが分かります。

全ての要求を転送するにはこの設定が便利そうです。

 

「$」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは要求パスの終了位置を示す「$」のみを指定しています。
この場合も、実質なんでもマッチングします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-dollar/ http://redirect.trce.info/d-dollar/
http://d-modrewrite.trce.info/d-dollar/dir/ http://redirect.trce.info/d-dollar/
http://d-modrewrite.trce.info/d-dollar/directory/ http://redirect.trce.info/d-dollar/
http://d-modrewrite.trce.info/d-dollar/subdir/ http://redirect.trce.info/d-dollar/

 

結果として、ルートディレクトリへの要求が空文字でである場合も含め、
全ての要求にパスの終了文字が含まれていることが分かります。

全ての要求を転送するにはこの設定が便利そうです。
「^」を利用するほうがスマートだとは思いますが。

 

「^$」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは要求パスに「^$」を指定して開始・終了のみを指定しています。
これは逆を言えば、要求パスが空である場合のみマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-dollar/ http://redirect.trce.info/d-caret-dollar/
http://d-modrewrite.trce.info/d-caret-dollar/dir/ × http://d-modrewrite.trce.info/d-caret-dollar/dir/
http://d-modrewrite.trce.info/d-caret-dollar/directory/ × http://d-modrewrite.trce.info/d-caret-dollar/directory/
http://d-modrewrite.trce.info/d-caret-dollar/subdir/ × http://d-modrewrite.trce.info/d-caret-dollar/subdir/

 

結果として、ルートディレクトリへの要求のみが空文字である為、
ルートディレクトリのみが転送されるようになります。

「^.」または「.」を指定した際とは逆の意味になります。

 

「dir/」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは固定文字「dir/」を条件指定しています。
開始位置を示す「^」を指定していませんので、
パス全体の中に「dir/」を含む場合(~dir/~)にマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-dir-slash/ × http://d-modrewrite.trce.info/d-dir-slash/
http://d-modrewrite.trce.info/d-dir-slash/dir/ http://redirect.trce.info/d-dir-slash/
http://d-modrewrite.trce.info/d-dir-slash/directory/ × http://d-modrewrite.trce.info/d-dir-slash/directory/
http://d-modrewrite.trce.info/d-dir-slash/subdir/ http://redirect.trce.info/d-dir-slash/

 

結果として「dir/」と「subdir/」がマッチして転送されています。

 

「^dir/」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは固定文字「dir/」を条件指定しています。
先頭に開始位置を示す「^」を追加しています。

開始位置を示す「^」を指定していますので
要求パスが「dir/」で始まる場合(dir/~)にマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-dir-slash/ × http://d-modrewrite.trce.info/d-caret-dir-slash/
http://d-modrewrite.trce.info/d-caret-dir-slash/dir/ http://redirect.trce.info/d-caret-dir-slash/
http://d-modrewrite.trce.info/d-caret-dir-slash/directory/ × http://d-modrewrite.trce.info/d-caret-dir-slash/directory/
http://d-modrewrite.trce.info/d-caret-dir-slash/subdir/ × http://d-modrewrite.trce.info/d-caret-dir-slash/subdir/

 

結果として「dir/」のみがマッチして転送されています。

 

「^dir」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは固定文字「dir」を条件指定しています。
先頭に開始位置を示す「^」を追加しています。

開始位置を示す「^」を指定していますので 要求パスが「dir」で始まる場合(dir~)にマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-caret-dir/ × http://d-modrewrite.trce.info/d-caret-dir/
http://d-modrewrite.trce.info/d-caret-dir/dir/ http://redirect.trce.info/d-caret-dir/
http://d-modrewrite.trce.info/d-caret-dir/directory/ http://redirect.trce.info/d-caret-dir/
http://d-modrewrite.trce.info/d-caret-dir/subdir/ × http://d-modrewrite.trce.info/d-caret-dir/subdir/

 

結果として「dir/」と「directory/」がマッチして転送されています。

 

「dir$」指定例

パターン一覧へ戻る

この指定パターンでは.htaccessに以下のように指定しています。

 

転送の確認

このパターンでは固定文字「dir」を条件指定しています。
最後に終了位置を示す「$」を追加しています。

終了位置を示す「$」を指定していますので
要求パスが「dir」で終わる場合(~dir)にマッチします。

転送元ページ 転送
可否
転送先等表示ページ
http://d-modrewrite.trce.info/d-dir-dollar/ × http://d-modrewrite.trce.info/d-dir-dollar/
http://d-modrewrite.trce.info/d-dir-dollar/dir/ × http://d-modrewrite.trce.info/d-dir-dollar/dir/
http://d-modrewrite.trce.info/d-dir-dollar/directory/ × http://d-modrewrite.trce.info/d-dir-dollar/directory/
http://d-modrewrite.trce.info/d-dir-dollar/subdir/ × http://d-modrewrite.trce.info/d-dir-dollar/subdir/

 

この場合「dir/」と「subdirectory/」はディレクトリ名は「dir」で終わっていますが、
要求パスとしては末尾が「/」になる為、

結果としてどの要求も条件に一致していません。

 

プロモーション(btm)

Google or AdMax Promotion (it)

さいごに

このようにして単純なパターンを個々に見ていくと、
それぞれの挙動が意図したとおりに動作していることが確認できます。

転送がうまくいかないとついつい「バグか?」と思ってしまいがちですが、
まず間違いなく書き方の誤りでしょう。

上手くいかない時はこうした単純なパターンでマッチしていることを確認して、
それから少しずつ条件を追加していくと、
複雑な転送パターンも組み立てやすくなります。

 


公開日:

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

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

Rakuten Promotion

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