目次

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

[ Category : .htaccess | DokuWiki | 正規表現 ] 2010年01月13日 13:37
 ウチの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がないので取っ付きにくいですよね…。どういうフローをするのか、パッと見てもさっぱりです…。しかも、「正規表現」で文字列の検索と置換を行っています。さてさて、正規表現が解らないと先に進めませんので、さっぱりという方は「サルにもわかる正規表現入門 超初心者入門がとても解りやすいので参考するとイイと思います。ボクも、まずそこを読んで正規表現というものの大筋をつかみました。

.htaccessの解読

1行目

RewriteEngine on

 これは、「.htaccessを使ってURLの書き換えを行う」機能のスイッチを入れるための宣言のようです。もちろん、「RewriteEngine off」とすれば、それ以降は無効になります。

2行目

# RewriteBase /dokuwiki

 「基準になるパスは『/dokuwiki』ですよ」という意味です。ウチの場合は、このように宣言すると「http://studio-arz.com/dokuwiki」というURLを指すことになるようです。DokuWikiをインストールしたディレクトリを指定する必要がありますが、ウチはルートディレクトリにインストールしていますので無効にしています。

3行目

RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1  [QSA,L]

 以前も、一度.htaccessの解読にチャレンジして、この3行目で匙を投げたんですがw、今日は食い下がります!!解読してみせますぜ!!!

1. RewriteRuleについて

RewriteRule A B [C]

 RewriteRuleは上のような書式で書かれ、「もし、Aというアクセスがあった場合はCのオプションでBに転送するように」という意味を表します。

2. Aの部分「^_media/(.*)」の解釈

 以上のことをふまえると、「文字列の先頭が『_media/』から始まっていて、その後に何でもいいので文字が0個以上繰り返されていた場合、『何でもいいので文字が0個以上繰り返されている部分』を$1という変数に格納してBに渡せ」という命令です。具体的に例を挙げると…

ということになります。

3. Bの部分「lib/exe/fetch.php?media=$1」の解釈

 前半部分の()内の文字列を「$1」という変数として受け取り、「_media/()」を「lib/exe/fetch.php?media=」に置き換える働きをします。要するに…

ということになります。

4. Cの部分「[QSA,L]」の解釈

 この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は必ず書いておいた方がよさそうな気がします。

4行目

RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1  [QSA,L]

 これは3行目が解れば理解できるので省略します。

道のりは長い...

 ふぅ…。えらく長くなりそうなので、5行目以降は次回に持ち越しますw。あぁしんど…。

参考文献

Discussion