ウチのDokuWikiは、マニュアルの通りに.htaccessを設定し、URLの書き換えを行っています。例えば、このページのURLはhttp://studio-arz.com/bliki/2010-01/002017.htmlになっていると思いますが、これは実在するURLではなく、本当はhttp://studio-arz.com/doku.php?id=bliki:2010-01:002017.htmlの内容を表示させています。SEO対策として有効らしい?という情報をもとに実践していることで、動的ページを静的ページのように偽装している(偽装というと悪く聞こえますがw何も悪いことではないと解釈しています)わけです。
さてさて、その.htaccessなんですが、はっきりいって意味が解ってませんw。マニュアルのコピペですww。でも、現在、やりたいことである「PCからと携帯からのアクセスを.htaccessで振り分ける」を実現するには、この.htaccessの内容を理解することから始めないとダメっぽいので、今日は、まず、いま実際に有効になっているウチの.htaccessファイルの意味を解読したいと思います。
では、まずはソースから
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]
apacheの構文って、ifやelseがないので取っ付きにくいですよね…。どういうフローをするのか、パッと見てもさっぱりです…。しかも、「正規表現」で文字列の検索と置換を行っています。さてさて、正規表現が解らないと先に進めませんので、さっぱりという方は「サルにもわかる正規表現入門 超初心者入門がとても解りやすいので参考するとイイと思います。ボクも、まずそこを読んで正規表現というものの大筋をつかみました。
RewriteEngine on
これは、「.htaccessを使ってURLの書き換えを行う」機能のスイッチを入れるための宣言のようです。もちろん、「RewriteEngine off」とすれば、それ以降は無効になります。
# RewriteBase /dokuwiki
「基準になるパスは『/dokuwiki』ですよ」という意味です。ウチの場合は、このように宣言すると「http://studio-arz.com/dokuwiki」というURLを指すことになるようです。DokuWikiをインストールしたディレクトリを指定する必要がありますが、ウチはルートディレクトリにインストールしていますので無効にしています。
RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L]
以前も、一度.htaccessの解読にチャレンジして、この3行目で匙を投げたんですがw、今日は食い下がります!!解読してみせますぜ!!!
RewriteRule A B [C]
RewriteRuleは上のような書式で書かれ、「もし、Aというアクセスがあった場合はCのオプションでBに転送するように」という意味を表します。
以上のことをふまえると、「文字列の先頭が『_media/』から始まっていて、その後に何でもいいので文字が0個以上繰り返されていた場合、『何でもいいので文字が0個以上繰り返されている部分』を$1という変数に格納してBに渡せ」という命令です。具体的に例を挙げると…
ということになります。
前半部分の()内の文字列を「$1」という変数として受け取り、「_media/()」を「lib/exe/fetch.php?media=」に置き換える働きをします。要するに…
ということになります。
このCの部分は、正式には「フラグ」と呼ばれているようで、オプションを指定するために使われているようです。
QSLは「Query String Append」の略、すなわち、「クエリ文字を引数として使いますよ」というオプション指定のようです。クエリ文字というのは、URLの末尾に「?a=○○○&b=△△△」といった形で書かれているものです。
Lは「Last」の略、すなわち「これにて終了」という意味のようです。自信がないですが、Lをつけるのとつけないのとでは、次のような違いがあるのではないかと解釈しています。
RewriteRule A B [L] RewriteRule C D [L]
と記述した場合は…
if (A){ B; }else if (C){ D; }
という風に、「AならばB」が実行された場合、「CならばD」は無視されることになりますが、
RewriteRule A B RewriteRule C D
と記述した場合は…
if (A){ B; } if (C){ D; }
という風に、「AならばB」が実行されたにも関わらず「CならばD」も検討してみることになるんじゃないですかね?そうなると、二重にURLの置き換えがなされたりする場合もありそうですので、Lは必ず書いておいた方がよさそうな気がします。
RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L]
これは3行目が解れば理解できるので省略します。