目次

.htaccessを用いたURL書き換えをマスターする・後編

[ Category : .htaccess | DokuWiki | 正規表現 ] 2010年01月13日 17:36
 さて、前編で、実際にウチのサーバで動いている.htaccessの1〜4行目を解読しましたので、今回は5行目以降を最後まで解読してしまいたいと思います。

ソース

 改めてソースです。

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]

 さてさて、俄然、ややこしくなってきました。頑張りましょうかねー!!

 ココまでは前編と同じですから理解できますが、今回は、「([^/]+)」なんてわけのわからない呪文が書かれていますw。

 以上のことから判断すると、「/以外の文字が何でもいいので1個以上繰り返されている文字列」ということになります。

 また、今回は()が2つ使われています。これは、出現した順に、$1, $2という具合に変数に代入されます。従って、「([^/]+) ⇒ $1, (.*) ⇒ $2」ということになります。

 要するに…

という書き換えが実行されることになります。

6行目

RewriteRule ^$ doku.php  [L]

 今回も新しいメタ文字が出てきました。

 文字列の先頭を表す「^」と、文字列の末尾を表す「$」が続けて書かれているということは、結局は「何も文字列がない」ことを表します。すなわち…

ですね!!

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

1) 文字列の先頭を表すメタ文字ではないので注意!