RewriteRuleによるディレクトリ判定例(ルートディレクトリ)
RewriteRuleに指定した条件によってURLの置換を行うか否かの
条件指定を行うことができます。
ここではルートディレクトリに配置した.htaccessに対しての挙動を紹介します。
複雑な操作が行えるmod_rewriteによるURL転送ですが、
いざ思ったことをしようとすると旨く転送が行えなかったりもするものです。
そんな時には基本的な転送条件による挙動を見直しておくと、
複雑な操作を行う上のベースとなってくれるでしょう。
RewriteRuleによるディレクトリ判定例(ルートディレクトリ)
ここではルートディレクトリを初めとした
各ディレクトリに対しての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に以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule / http://redirect.trce.info/d-slash/ [R=302,L] </IfModule> |
転送の確認
このパターンではルートディレクトリへのアクセス時に、
RewriteRuleの条件指定において、ルートである「/」がマッチングするかを検証しています。
結果として、ルートディレクトリでは、
「/」はマッチングせず、サブディレクトリ以降のみでマッチングし転送が行われています。
「^」を指定していないことから、任意の場所に「/」が存在することで判定しています。
この判定だけで既に立証ができていますが、
ルートディレクトリへアクセスがあった場合には、
「/」がRewriteRuleの条件判定に利用されるわけではなく、
「(空文字)」へのアクセスとして要求されることが分かります。
「^/?」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^/? http://redirect.trce.info/d-caret-slash-quest/ [R=302,L] </IfModule> |
転送の確認
このパターンではスラッシュに対して「?」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。
「?」は正規表現では「直前のサブ式と 0 回または 1 回一致」ですので、
この場合開始位置の次の文字で、
「/」が0回または1回現れる場合にマッチングします。
この場合には「/」ではマッチングしなかった、
ルートディレクトリがマッチングしていますが、
これはすべてがスラッシュ0回扱いでマッチングしています。
この立証には次のパターンでわかります。
「^/+」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^/+ http://redirect.trce.info/d-caret-slash-plus/ [R=302,L] </IfModule> |
転送の確認
このパターンではスラッシュに対して「+」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。
「+」は正規表現では「直前のサブ式と 1 回以上一致」ですので、
この場合開始位置の次の文字で、
「/」が少なくとも1回現れる場合にマッチングします。
この場合、すべての転送が行われなくなりました。
これは要求パスの開始文字の次の文字がどれもスラッシュではない為です。
それぞれの1文字目は以下になり、どれもスラッシュには一致していません。
- (空文字)
- d
- d
- s
「^/*」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^/* http://redirect.trce.info/d-caret-slash-asta/ [R=302,L] </IfModule> |
転送の確認
このパターンではスラッシュに対して「*」条件を追加しています。
また文字の開始位置を示す「^」を追加しています。
「*」は正規表現では「直前のサブ式と 0 回以上一致」ですので、
この場合開始位置の次の文字で、
「/」が0回以上一致になりますので「/」ではなくでもマッチングします。
この場合、すべての転送が行われます。
ぶっちゃけ「/*」であろうと「.*」であろうと「*」を採用した時点で、
マッチングしていようと、していまいと関わらず、マッチング判定が得られます。
「^.」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^. http://redirect.trce.info/d-caret-dot/ [R=302,L] </IfModule> |
転送の確認
このパターンでは開始位置の次の文字に対して「.」条件を付与しています。
この場合、要求パスが空ではない場合にマッチします。
結果として、ルートディレクトリへの要求が空文字であることが分かります。
要求パスがルート以外への要求である場合に、
URL転送を行いたい場合に便利な判定条件です。
「^」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^ http://redirect.trce.info/d-caret/ [R=302,L] </IfModule> |
転送の確認
このパターンでは要求パスの開始位置を示す「^」のみを指定しています。
この場合、実質なんでもマッチングします。
結果として、ルートディレクトリへの要求が空文字でである場合も含め、
全ての要求にパスの開始文字が含まれていることが分かります。
全ての要求を転送するにはこの設定が便利そうです。
「$」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule $ http://redirect.trce.info/d-dollar/ [R=302,L] </IfModule> |
転送の確認
このパターンでは要求パスの終了位置を示す「$」のみを指定しています。
この場合も、実質なんでもマッチングします。
結果として、ルートディレクトリへの要求が空文字でである場合も含め、
全ての要求にパスの終了文字が含まれていることが分かります。
全ての要求を転送するにはこの設定が便利そうです。
「^」を利用するほうがスマートだとは思いますが。
「^$」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^$ http://redirect.trce.info/d-caret-dollar/ [R=302,L] </IfModule> |
転送の確認
このパターンでは要求パスに「^$」を指定して開始・終了のみを指定しています。
これは逆を言えば、要求パスが空である場合のみマッチします。
結果として、ルートディレクトリへの要求のみが空文字である為、
ルートディレクトリのみが転送されるようになります。
「^.」または「.」を指定した際とは逆の意味になります。
「dir/」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule dir/ http://redirect.trce.info/d-dir-slash/ [R=302,L] </IfModule> |
転送の確認
このパターンでは固定文字「dir/」を条件指定しています。
開始位置を示す「^」を指定していませんので、
パス全体の中に「dir/」を含む場合(~dir/~)にマッチします。
結果として「dir/」と「subdir/」がマッチして転送されています。
「^dir/」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^dir/ http://redirect.trce.info/d-caret-dir-slash/ [R=302,L] </IfModule> |
転送の確認
このパターンでは固定文字「dir/」を条件指定しています。
先頭に開始位置を示す「^」を追加しています。
開始位置を示す「^」を指定していますので
要求パスが「dir/」で始まる場合(dir/~)にマッチします。
結果として「dir/」のみがマッチして転送されています。
「^dir」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^dir http://redirect.trce.info/d-caret-dir/ [R=302,L] </IfModule> |
転送の確認
このパターンでは固定文字「dir」を条件指定しています。
先頭に開始位置を示す「^」を追加しています。
開始位置を示す「^」を指定していますので
要求パスが「dir」で始まる場合(dir~)にマッチします。
結果として「dir/」と「directory/」がマッチして転送されています。
「dir$」指定例
この指定パターンでは.htaccessに以下のように指定しています。
1 2 3 4 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule dir$ http://redirect.trce.info/d-dir-dollar/ [R=302,L] </IfModule> |
転送の確認
このパターンでは固定文字「dir」を条件指定しています。
最後に終了位置を示す「$」を追加しています。
終了位置を示す「$」を指定していますので
要求パスが「dir」で終わる場合(~dir)にマッチします。
この場合「dir/」と「subdirectory/」はディレクトリ名は「dir」で終わっていますが、
要求パスとしては末尾が「/」になる為、
結果としてどの要求も条件に一致していません。
さいごに
このようにして単純なパターンを個々に見ていくと、
それぞれの挙動が意図したとおりに動作していることが確認できます。
転送がうまくいかないとついつい「バグか?」と思ってしまいがちですが、
まず間違いなく書き方の誤りでしょう。
上手くいかない時はこうした単純なパターンでマッチしていることを確認して、
それから少しずつ条件を追加していくと、
複雑な転送パターンも組み立てやすくなります。
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に承認されライセンスされています。
公開日: