.htaccessを用いたURL書き換えをマスターする・後編
ソース
改めてソースです。
RewriteEngine on # RewriteBase /dokuwiki RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L] RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L] RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L] RewriteRule ^$ doku.php [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) doku.php?id=$1 [QSA,L]
.htaccessの解読
5行目
RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
さてさて、俄然、ややこしくなってきました。頑張りましょうかねー!!
- ^ → 文字列の先頭を表す
- . → 何でもいい1文字
- * → 直前の文字が0個以上繰り返されることを表す
ココまでは前編と同じですから理解できますが、今回は、「([^/]+)」なんてわけのわからない呪文が書かれていますw。
- [] → []内に複数書かれた1文字のいずれか
- ^ → ^が[]内で使われた場合、「それ以外」を表す1)
- + → 直前の文字が1個以上繰り返されることを表す
以上のことから判断すると、「/以外の文字が何でもいいので1個以上繰り返されている文字列」ということになります。
また、今回は()が2つ使われています。これは、出現した順に、$1, $2という具合に変数に代入されます。従って、「([^/]+) ⇒ $1, (.*) ⇒ $2」ということになります。
要するに…
- http://studio-arz.com/_export/abcd/efgにアクセス
↓
http://studio-arz.com/doku.php?do=export_abcd&id=efgに転送
という書き換えが実行されることになります。
6行目
RewriteRule ^$ doku.php [L]
今回も新しいメタ文字が出てきました。
- $ → 文字列の末尾を表す
文字列の先頭を表す「^」と、文字列の末尾を表す「$」が続けて書かれているということは、結局は「何も文字列がない」ことを表します。すなわち…
- http://studio-arz.com/にアクセス
↓(何も文字列がないので)
http://studio-arz.com/doku.phpに転送
ですね!!
7〜9行目
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) doku.php?id=$1 [QSA,L]
この3行はセットになって動いています。「RewriteCond %{REQUEST_FILENAME} !-f」は、「もし、リクエストされたファイルが実在しなければ」という意味で、「RewriteCond %{REQUEST_FILENAME} !-d」は、「もし、リクエストされたディレクトリが実在しなければ」という意味です。リクエストされたファイルもディレクトリも実在しなければ、9行目の「RewriteRule (.*) doku.php?id=$1 [QSA,L]」が実行されるわけです。この3行のフローを仮にifを使って強引に表すと、次のようになりますね!
if (RewriteCond %{REQUEST_FILENAME} !-f){ if (RewriteCond %{REQUEST_FILENAME} !-d){ RewriteRule (.*) doku.php?id=$1 [QSA,L] } }
解読完了!!
どうにかなったっぽい
ふぅ〜。どうにか解読できました!!とは言え、推測も入っていますので、間違っている可能性があります。どなたか知識のある方がたまたま通りかかり、間違いを発見した際には、お手数ですがコメント等でご指摘くだされば幸いです。どうぞよろしくお願い致します。また、お決まりの文句ではありますが、ココに書かれた内容を実践する場合は、くれぐれも自己責任でお願い致します。
Next Mission
さて、次なる課題は「PCと携帯からのアクセスを.htaccessで振り分ける」ですね!うまくいくかな〜
参考文献
Discussion
- 投稿する前に「Discussionのガイドライン」をご一読くださいませ。