それマグで!スマートフォン用の表示で見るそれマグで!知識はカップより、マグでゆっくり頂きます。mod_rewrite。しても理解できないmod_rewriteです。そのためにコピペで済ませてしまう。基本的な処理の流れや記述方法を調べようと思ってもあまり資料が無かったりする。幾つかの機能を組み合わせると、出来過ぎるので、資料をまとめるのも一苦労。まとめの方向性はは次の通りを考えています。追いかけるエラーログ。このながれでまとめていきたい。対応表mod_rewrieでは、RewriteRuleがメインで、RewriteCondが条件になる。書き換え規則をハッシュマップ(連想配列、ディクショナリ)で記述し、RewriteCondやRewriteRuleの記述を簡潔にできる。RewriteMapにつかえるフォーマット・タイプ。RewriteMapの書換表には、フォーマットが幾つか用意されています。txtrnddbmintprgこれらのフォーマットが使える。他に独自タイプ(関数)を定義してタイプとして使えるそうだ。基本的な記述方法についてルールをシンプルに記述した基本的な記述方法になります。記述する内容は、次のとおりです。行います、殆どの場合デフォルトでロードされています。ロードされていてて、書換出来ない場合、このときは有効化がされてない可能性があります。Rewriteの有効化と基本ルール次のとおりに、Rewriteを有効化し、書換のルールを記述します。/index.phpRewriteRuleの記述内容はRewriteRuleの記述形式を、日本語で表記すると、次の通りになります。オプションRewriteRuleは、単なる正規表現での置換と考えて差し支えないとおもいます。urlのメソッド呼び出しと解釈できます。URL.replaceを呼び出していると解釈しています。);}私は、RewriteRuleは上記のJavaScriptに非常に近い処理をしていると考えています。書換を実際に体験してみる。基本ルールが分かったので、次に書換を試してみようと思います。次ようなディレクトリ構造を想定し、実際に書換を行いながら、RewriteRuleについて理解を深めていきましょう。ディレクトリ構造を作りました実験環境として、次のようなディレクトリ構造を作成しました。mod_rewriteの設定を記述していきます。中身get.phpはリクエストを書き出すだけ。Rewriteが発動し、リクエスト書換を確認できるよう、シンプルにGET引数だけを見ることにしました。var_dump($_GET);mod_rewriteの設定は、すべてのこのget.phpへ向けて書換を行うよう記述する予定です。サンプルを用意します。パラメータに書換結果を保存して転送する予定です。これで、準備は整いました。よるリダイレクトを体験してみます。次は、リクエストをおこなってみた結果です。転送されてることがわかる。存在しないファイルへのリクエストです。対象ディレクトリではmod_rewriteによる書換が有効になっています。Found)になりません。ポイントは、ブラウザから見えるURLはそのままで中身が変わってる点です。curlコマンドは302リダイレクトを追いかけないので、結果が表示されるのは、URLはそのままで内部リダイレクトが起きたことを示しています。この転送はApacheのリクエスト処理内部で行われブラウザには一切見えません。全てのリクエストは、内部的に転送される。サンプルが記述されたURLへリクエストを送信すると、Apacheとmod_rewriteはそれを書きまえました。今回のサンプルでは、当該ディレクトリに対するリクエストは全て転送されます。転送はApache内部で行われます、ブラウザに302は送信されません。オプションをつけると。それでは、書換に依る内部リダイレクトの代わりに、Apacheから302を送信してみます。素のRewriteRuleではブラウザには転送されたことが見えません。これをHTTPコードで見える形で書換と転送を行いわせます。そのためには、Ruleに第三のオプションのフラグをつけてみる。リダイレクト・オプションをつけたRewriteRule302を送信するのは、カンタンです。[R]をオプションとして末尾に追記するだけです。[R]リクエストしてみた結果[R]を追記したURLへリクエストを送信して、結果を観察してみます。ヘッダ情報を表示してリクエストを送信します。charset=iso-8859-1転送は内部的ではなくなりました。ブラウザとの相互作用に変化しています。[R]を追記すればブラウザにリダイレクト応答を送信するように変化ことが確認できた。リダイレクトや転送や書換を行うだけじゃない。オプションでアクセス制限をつけうることも出来ます。403を送信しUnauthorizedでブラウザにコンテンツ送信を拒否してみます。つけれけば、該当URLを表示を禁止出来るとわかります。変更[F]を試してみた。この設定をつけたURLへリクエストを送ります。Forbiddenこのときには、URL正規表現でマッチだけで十分なので、書換文字列の指定は無駄ですね。」(ハイフン:なにもしない)に交換しておきます。しアクセス禁止を実現しています。オプションリクエストURI(GET引数は含まない)ものが正規表現にマッチするか調べる。マッチすれば、書換ルールにしたがって処理。RewriteCondそれは、Ruleについてはひとまず終わって。RewriteCondについて見てきます。RewriteCondはその名前の通り、「条件」を追加するもので、追加した条件はAndで結合されていきます。URL以外も条件に使うにはRewriteCond条件を決めて、条件にマッチしたものをRuleに引き渡す。禁止する画像拡張子にマッチさせます。REQUEST_FILENAMEにファイル名(basename)が格納されています。REQUEST_FILENAMEに指定拡張子が含まれる」を追加しました。../get.php?from=ex1このように書くと、ファイル名が画像拡張子にマッチするときに、内部転送される。拡張子にマッチして転送される。実際にリクエストをおこなってみました。存在しませんが、ファイル名としてマッチするのでRewrite対象になっています。逆にマッチしない時には、通常リクエストとして扱われる。通常リクエストとして、処理され、ファイルがないので404になっている。Found</title>拡張子がなくマッチしません。通常リクエストとして扱われました。Rewriteの対象外になっています。したものが、リダイレクト対象になっています。全てのアクセスに対し拡張子で絞りこみました。URLのマッチも行われています。Ruleの整理ここまでで、RewriteRuleとCondをペアで使っています。先例は、正規表現がディレクトリ内の全ファイル対象なので、RuleのURL条件が、わかりにくい気がします。Condに指定した拡張子はURLでもあるので、混乱しそうです。「Rule:URLにhogeを持つ」と組み合わせるRewriteRule側の条件を細かくしてみます。Rule側でファイル名やパス名に関するマッチを追加して、And条件で判定されていることを明確にしたいと思います。「hoge文字列にマッチ」とRule条件に変えてみる全パターンを指定せずに、URLの特定文字列の時だけと、Rule判定を追加します。Condで判定されるので、以下のようにリクエストURLを変更すると、マッチと非マッチが明確に分離されます。実際にリクエストした結果が次の通りになります。ruleにはマッチするが、Condにはマッチしない。判定なのでマッチしないと判断される。Found</title>RewriteCondを使うことで、条件をより複雑に出来る。諸刃の刃で、複雑になればなるほど解析と理解が苦しくなる。それぞれANDで結合される。複数Ruleを書く場合このあたり方どんどん面倒になってくるのですが。頑張って記述してきます。書いたとおりになるのでしょうか。どちらが適用されるか?実際に試してみるとわかります。"ex1-rule2"}Ruleは全て実行。Ruleは全てチェックされます。hoge.jpgもどちらもrule2が適用された、コレには理由があります。それは、RewriteRuleは順番に全てチェックするという「基本的処理の流れ」に従っているためのです。