.htaccessを用いたURL書き換えをマスターする・前編
ウチの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/(.*)」の解釈
- ^ → 文字列の先頭を表す
- . → 何でもいい1文字
- * → 直前の文字が0個以上繰り返されることを表す
- () → この内側を$1という変数としてBの部分に渡す
以上のことをふまえると、「文字列の先頭が『_media/』から始まっていて、その後に何でもいいので文字が0個以上繰り返されていた場合、『何でもいいので文字が0個以上繰り返されている部分』を$1という変数に格納してBに渡せ」という命令です。具体的に例を挙げると…
- http://studio-arz.com/_media/index.html
↓
$1='index.html' をBに渡す
- http://studio-arz.com/_media/aaa.png
↓
$1='aaa.png' をBに渡す
- http://studio-arz.com/media/aaa.png
↓
先頭が「_media/」から始まっていないので無反応
ということになります。
3. Bの部分「lib/exe/fetch.php?media=$1」の解釈
前半部分の()内の文字列を「$1」という変数として受け取り、「_media/()」を「lib/exe/fetch.php?media=」に置き換える働きをします。要するに…
- http://studio-arz.com/_media/index.htmlにアクセス
↓
http://studio-arz.com/lib/exe/fetch.php?media=index.htmlへ転送
- http://studio-arz.com/_media/aaa.pngにアクセス
↓
http://studio-arz.com/lib/exe/fetch.php?media=aaa.pngへ転送
- http://studio-arz.com/media/aaa.pngにアクセス
↓
先頭が「_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行目が解れば理解できるので省略します。
道のりは長い...
参考文献
Discussion
- 投稿する前に「Discussionのガイドライン」をご一読くださいませ。