.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/(.*)」の解釈

  • ^ → 文字列の先頭を表す
  • . → 何でもいい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行目が解れば理解できるので省略します。

道のりは長い...

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

参考文献

Discussion

Tag Cloud

005sh 3dプリンタ 930ca adsense adwords awesomenote bar bliki bootcamp brita canolite centos6.4 cheerz chrome cms cms開発プロジェクト css database dokuwiki dreamweaver dsi dtm e-p1 e-pl1 edv-01 entities.conf evernote evetnote exilim eye-fi fasteverxl filemaker fishmans flipboard fpdf fpdi ftp garageband gizmon glue=_><$mttagname$> google gw hp作成 htaccess ielectribe imac ims-20 ipad ipad2 iphone itunes iweb jazz joomla lifegame linux lumix mac macbook mixiモバイル movabletype mp3play musescore nokton nokton25mmf0.95 noteslate open.thumbshots.org photomess php plugin pocketwifi pv rewritebase rewritecond rewriteengine rewriterule rolleicord safari scansnap seo serenar smc tcpdf timemachine transmit twin-t twitter ustream vmware waon web webthumbs webデザイン wimax windows yahoo youtube あずきフォント おでん お年玉 お知らせ みなと祭 アイダホバーガー アニメ アルネ・ヤコブセン イベント ウサビッチ エヴァンゲリオン オナラ禁止令 オープンスクール ガレット クイズ コシナ ゴールデンウィーク ストーブ料理 ダイナミックレンジ テザリング テレバイダー トムヤムクム ニコニコ動画 ネット家計簿ココマネ バックライト バンダイチャンネル パンダオセロ ピアノ フィッシング プチコン プラグイン ホームページ ボウズ マイクロフォーサーズ マウントアダプタ マクドナルド メンズスカート メンテナンス ラチチュード ラ・カンパネラ リスト 三晃精機 三相3線 上関原発 下関 中国 中学受験 中西進学中 中西進学塾 久石譲 乾燥肌 二眼レフ 会計ソフト 価格.com 写真 冷凍野菜 冷凍食材 出汁 動画 北九州高専 卒塾生 卒業 単相3線 吉田カバン 味噌 味噌汁 営業 坂本龍一 大島商船 妃田智 子どもと読書 家庭学習支援 家計簿 小学生と英語 小論文の指導 嶺川貴子 川南造船所 川棚 差し入れ 広告デザイン 情報のインフレ 情報教育 愛の夢 扇風機 掃除機 携帯電話 放課後のプレアデス 教材作成 教科書 敬愛中 敬愛中学校 数学 数式 文字コード 日新館中 日明の湯 森鷗外 椅子 業務日報 楽の湯 楽譜 機動戦士ガンダム 正規表現 津和野 海苔 火災 炊飯器料理 甘き死よ、来たれ 発酵 相対性理論 確定申告 節約 篆刻 経費削減 縦書き 自主制作アニメ 自宅サーバ 自習室 著作権 蟲師 西南女学院中 誕生日がずれる 誠徳義塾 調律 買い物 軍事遺構 軍艦島 転入学 近況報告 迷惑メール 配布物 金剛地武志 門司学園中 門司港 附属小 陸上自衛隊高等工科学校 電気代 食費 餃子 高校入試 高校受験
 
http://studio-arz.com/bliki/2010-01/002017.html · 最終更新: 2011年01月25日 via MovableType 3.33-ja
 
RSS2.0
Clip to Evernote