改めてソースです。
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]
RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L]
さてさて、俄然、ややこしくなってきました。頑張りましょうかねー!!
ココまでは前編と同じですから理解できますが、今回は、「([^/]+)」なんてわけのわからない呪文が書かれていますw。
以上のことから判断すると、「/以外の文字が何でもいいので1個以上繰り返されている文字列」ということになります。
また、今回は()が2つ使われています。これは、出現した順に、$1, $2という具合に変数に代入されます。従って、「([^/]+) ⇒ $1, (.*) ⇒ $2」ということになります。
要するに…
という書き換えが実行されることになります。
RewriteRule ^$ doku.php [L]
今回も新しいメタ文字が出てきました。
文字列の先頭を表す「^」と、文字列の末尾を表す「$」が続けて書かれているということは、結局は「何も文字列がない」ことを表します。すなわち…
ですね!!
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] } }
ふぅ〜。どうにか解読できました!!とは言え、推測も入っていますので、間違っている可能性があります。どなたか知識のある方がたまたま通りかかり、間違いを発見した際には、お手数ですがコメント等でご指摘くだされば幸いです。どうぞよろしくお願い致します。また、お決まりの文句ではありますが、ココに書かれた内容を実践する場合は、くれぐれも自己責任でお願い致します。
さて、次なる課題は「PCと携帯からのアクセスを.htaccessで振り分ける」ですね!うまくいくかな〜