ある特定のディレクトリやファイルに対して
動的URL(クエリ―式)でアクセスがあった場合は
mod_rewriteを使って静的URL(path info式)で処理されるようにする。
例えば以下のような記述を
httpd.confなどに記述する。
htaccessに記述する場合は前回同様
若干仕様が異なるので注意。
特にログの設定や、マップの指定をhtaccessにすると
エラーが起こるようです。
Code:
#リライトエンジンの開始 | |
RewriteEngine On | |
#ログの指定 | |
RewriteLog "/var/log/httpd/hoge-rewrite.log" | |
#ログの出力レベル(大きくするほど重くなります) | |
RewriteLogLevel 9 | |
#マップの設定 | |
RewriteMap hoge txt:/usr/local/etc/apache22/map.txt | |
| |
#ルールの設定 | |
RewriteRule ^/test/([^/]+)$ /test/index.php?key=${hoge:$1} [L] |
この場合、http://myhostname.com/test/ほげ
などの日本語を含むURLにもマッチします。
そしてそれを/test/index.phpにアクセスされたものとして処理をします。
このときにhttp://myhostname/test/ほげ/index.php?hoge=1111&piyo=piyotarou
などのパラメータは%{QUERY_STRING}に変数として格納され
/test/index.phpにくっついていきます。
そして最後に[L]というフラグをくっつけます。
このフラグはこのルールが適用されたら、それ以降のルールの適用をストップするという意味があります。
これがないと、これ以降に記述されたルールに次々と適用するかどうかの処理が続いてしまうので注意です。
getでパラメータを投げる場合、URLは必ず
http://myhost/index.php?name=ぴよ
のように動的なURLになってしまいます。
これをmod_rewriteのリダイレクト機能を使ってURLを書き変えたいのですが
くっついてくるパラメータによってリダイレクト先を変えたい場合には
mod_rewriteのリダイレクト機能だけでは不十分です。
(僕はそのように感じただけで、他に何かやり方があるかもしれませんのでご注意を。)
例えばフォームで投稿したときのURLを
のようにしたい場合に当てはまります。
ルールを以下のようにします。
Code:
RewriteRule ^/test/index.php$ /test/controller.php?%{QUERY_STRING} [L] | |
RewriteRule ^/test/([^/]+)/index.php$ /test/index.php?name=$1 [L] |
フォームを投稿したときブラウザはまず
http://myhost/index.php?name=ぴよ
とリクエストします。
すると、一つ目のルールに引っ掛かります。
(なおパターン的には二つ目のルールにもマッチしますが、[L]フラグが立っているので
二つ目のルールは無視されます)
一つ目のルールによってcontroller.phpにパラメータ付で処理をします。
controller.phpはQUERY_STRINGを分析して新しいURLを組みなおして
header()で二つ目のルールに当てはまるようなURLに飛ばします。
例えば
/test/ぴよ/index.php
と指定します。
そうすると二つ目のルールにマッチし、
/test/index.php?name=ぴよ
と解釈されます。
これで、ブラウザのURLは
/test/ぴよひこ/index.php
と表示されたままになります。
Trackback URL (right click and copy shortcut/link location)