復興ログ

未来の被災地にいるアナタと数十年後のキミたちへ。すべての記録を残します。

フレームワークの.htaccess

フレームワークとして使う.htaccessのメモです。

# (1)
RewriteEngine On
RewriteBase /

# (2)
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]

# (3)
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L] 

.htaccessを使ってRewriteを効かせてパラメータの制御をしようというものです。

(1)

RewriteEngine On
RewriteBase /

お約束です。Rewriteを効かせる宣言です。
ベースをドキュメントルートに設定しています。

(2)

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L]

実ファイルがサーバ内に存在していたら、そのファイルへのアクセスを行う設定です。

(3)

RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L]
RewriteRule ^([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/([A-z0-9_]+)/$ index.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5 [QSA,NE,L] 

実ファイルがサーバ内に存在していない場合の動作です。
ルートから最大5階層目までのRewriteRuleを設定しています。
例えば
実態ファイルが存在しないのに

/aaa/bbb/ccc/ddd/eee/

にアクセスをすると

/index.php?p1=aaa&p2=bbb&p3=ccc&p4=ddd&p5=eee

にRewriteをかけます。

オプション

QSA Query String Append クエリ文字を引数として扱う
NE No Escape URLエスケープを行わない
L Last RewriteRuleをそれ以降の行で適用しない

利点

これをすると何が都合がいいのか、というと下記の点が上げられます。

  • 全てのアクセス(5階層目まで)をルート以下のindex.phpで処理することが可能となる
  • 各ページの動きはGETの値として渡される
  • コントローラーを作成することができる

こんな感じでしょうか。

深い階層までアクセスされたときに、その階層分だけ引数で渡してあげられる方法はないものでしょうかね?