mod_rewriteネタその2

2007/01/05 | mojavi2

mojaviで使うmod_rewriteだけど、少しだけ進展させてみた。
こんな内容。

RewriteEngine On

# 実在ファイルへのアクセスはそのまま流す
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* – [L]

#モジュールだけ指定されていた場合はactionはindexを指定
RewriteRule ^([^/]+)/?$ – [C]
RewriteRule !^rulebase/? – [C]
RewriteRule ^([^/]+)/?$ /index.php?module=$1&action=index [L]

#モジュールとアクションだけが指定されていたら(スラッシュの
#有無にかかわらず)
RewriteRule ^([^/]+)/([^/]+)/?$ – [C]
RewriteRule !^rulebase/? – [C]
RewriteRule ^([^/]+)/([^/]+)/?$ /index.php?module=$1&action=$2 [L]

#後ろにスラッシュがあって、さらにパラメータが指定されたら
#とりあえずモジュールとアクションだけ書き換え
RewriteRule !^rulebase/? – [C]
RewriteRule ^([^/]+)/([^/]+)/(.*) /rulebase/$3?module=$1&action=$2

#次にパラメータを書き換えて、パラメータの数だけ繰り返す
RewriteRule ^rulebase/([^/]+)/([^/]+)(.*)$ /rulebase$3?$1=$2 [QSA,N]
RewriteRule ^rulebase/?$ /index.php [QSA,L]

いちおう動いている模様。
これで進めることにする。

mojaviのURLを少し短くするmod_rewrite

2006/12/29 | mojavi2

検索エンジン対策のためにPATH_INFOを使ってプログラムを使用していることを隠蔽するというのは、mojaviでも設定ファイルひとつで対応可能だ。でもこの方法だと、URLが結構長くなってしまう。例えばmoduleAのactionBにアクセスするには、以下のような具合だ。

/index.php/module/moduleA/action/actionB

これをさらに短くするためにURL書き換え機能(mod_rewrite)を使うわけだが、このmod_rewrite、強力なURL書き換え機能を持っているだけに、設定の記述も難解だ(今まではあえて避けてきた)。
たまたま必要に迫られて検索をかけると、見事なのを見つけた。以下のように書いておけばいい。

RewriteEngine On
# to avoid problems with exsisting files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* – [L]
# rewrite broken relative image paths
RewriteRule ^.+(images|scripts|files)/(.*)$ /$1/$2 [L]
RewriteRule !^ind/? – [C]
RewriteRule ^([^/]+)/([^/]+)/(.*) /ind/$3?module=$1&action=$2
RewriteRule ^ind/([^/]+)/([^/]+)(.*)$ /ind$3?$1=$2 [QSA,N]
RewriteRule ^ind/?$ /index.php [QSA,L]

この設定により、上記のURLが以下のようになる。
/moduleA/action1

2つを見比べると短さは一目瞭然!。
/index.php/module/moduleA/action/actionB
/moduleA/actionB

そしてパラメータ(QUERY_STRING)を指定する場合も、以下のように指定すればOK。
/moduleA/actionB/param1/value1/param2/value2・・・

出展はこちら
これによるとパラメータを10以上つけるようなことがある場合は、以下の一行を付け加えておく必要があるとのことだ。

RewriteOptions MaxRedirects=25

よくはわからないけど、[QSA,L]の記述により、パラメータの個数だけ内部的に(mod_rewrite複数回呼び出しみたいな・・・)再読み込みするらしい。んで、再読み込みの回数の上限は9回だから、パラメータが9より多い場合は上記の1行で上限回数を増やす必要があるようだ。

すばらしい。
まさに「URLを操作するためのスイス製のアーミーナイフ」だ。

ActionChainは引数が渡せる

2006/10/20 | mojavi2

最近まで知らなかった(単にソースを熟読していないだけなのだが)。
ActionChainは引数を渡すことができる。
registerする際に・・・。

$ac=new ActionChain();
$ac->register(‘登録名’,’モジュール名’,’アクション名’,array(‘引数名’=>’引数値’));

これだけでいい。
しかし・・・mojavi2って最近は使っている人いるのだろうか。
今はPHPフレームワークの過渡期。そろそろ新しいものにチャレンジする必要もありそう。Zendとかね。

PATH_INFOが取得できないときは

2006/06/18 | mojavi2

これも使えるネットねたなのだが・・・。
mojaviでは検索エンジン対策としてPATH_INFO形式を使用するようにしているけれど、使えるネットでは使えなかった(使えねー)。
調べたらわかった。apacheの設定で可能になるようだ。
httpd.confに以下の一行を書き加えて解決した。

AcceptPathInfo On

一件落着。

2つのテンプレートを使う

2006/05/24 | mojavi2

通常ウェブデザインをする際は、基本的な枠組み(例えばヘッダとフッタとか)は全ページで共通したものを使用し、その間に挟まれるコンテンツ部分のみを変更するのが一般的だ。つまり共通するテンプレートを用意し、コンテンツ部分のテンプレートをころころ入れ替えるわけだ。
mojaviでこれを実行するには以下の方法を使えばよい(と思う)。記述はviewクラスの中に記述する。

(1) $myRenderer->setTemplate(‘contents.tpl’);
(2) $myRenderer->setMode(RENDER_VAR);
(3) $contents=$myRenderer->fetchResult($controller,$request,$user);
(4) $myRenderer->setMode(RENDER_CLIENT);
(5) $myRenderer->setAttribute(‘contents’,$contents);
(6) $myRenderer->setTemplate(‘global.tpl’);
(7) return $myRenderer;

ちなみにcontents.tplはコンテンツ部分のみのテンプレート、global.tplは枠のテンプレートになる。通常の場合であれば(1)のあとに(7)がきて終わりになる。そこに(2)から(6)のスクリプトを足す。
(2)でレンダリングモードを変更する。ActionChainで呼ばれない限り、レンダリングモードは通常RENDER_CLIENT(CLIENTに向けてレンダリングする)になっている。それを一時的にRENDER_VAR、すなわりVAR(変数)に向けてレンダリングするように変更するのだ。この一時的な設定変更により(3)でレンダリング内容を変数に格納することができる。
変数に格納したらレンダリングモードを元に戻し(4)、取得したコンテンツを枠のテンプレートに格納する(5)(6)。
これでできあがり。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net