たぶん難しくないApache2・挑戦!RewriteRule・その2~基礎編:さらに条件を組み合わせる~ [Linux(Apache)]
基礎編ではあるが、ちょっとややこしくなってくるので気合入れて読むように。(笑)
さて。RewriteRuleの本領はここから発揮されるのであった。
CGIを自作したことがある人なら知っていると思うが、Apache2をはじめとするWebサーバは、CGIに対して”環境変数”を通じて様々な情報を通知する機能を有している。
たとえば、「HTTP_USER_AGENT」は、そのCGIにアクセスしてきたクライアントのブラウザに関する情報を通知する変数であるし、「HTTP_REFERER」は、そのCGIへのリンクが張られていたページのURLを通知する変数である。
こうした環境変数を評価してRewriteRuleを実行する/しないの制御を行うことも可能なのであった。そのためのディレクティブを紹介する。
RewriteCond 評価対象 評価パターン
このRewriteCondディレクティブは、RewriteRuleディレクティブの前に1個以上記述する。すると、RewriteCondの評価内容をチェックし、当てはまらない場合には、このRewriteCondに続く最初に遭遇したRewriteRuleディレクティブの実行をキャンセルするようになる。
言葉だけで書いているとなんか判りづらいので、実例を挙げてみよう。
RewriteEngine on
RewriteCond %{HTTP_HOST} class-3.\.ryoou-gakuen\.ac\.jp
RewriteRule ^/lucky-star/(.*) /graduate/$1 [R]
RewriteRule ^/washimiya-jinja/(.*) http://www.washimiya-jinja.org/$1 [R]
こんな設定があったとしよう。この例で示したRewriteCondディレクティブは、ホスト名をチェックしている。変数「HTTP_HOST」の内容が、class-3.\.ryoou-gakuen\.ac\.jpとマッチするかしないかを判定しているが、マッチした場合には、URLの「/luck-star/」を「/graduate/」に書き換えるRewriteRuleが実行される。しかし、マッチしなかった場合はそのRewriteRuleの書き換えは実行されない。
しかし、「/washimiya-jinja/」を「http://www.washimiya-jinja.org/」にリダイレクトするRewriteRuleは、RewriteCondの判定結果にかかわらず必ず実行されるのであった。
つまり。
http://class-3b.ryoou-gakuen.ac.jp/lucky-star/hoge.html
↓
http://class-3b.ryoougakuen.ac.jp/graduate/hoge.html
という書き換えが発生するが、
http://class-1d.ryoou-gakuen.ac.jp/lucky-star/hoge.html
↓
http://class-1d.ryoou-gakuen.ac.jp/lucky-star/hoge.html
と、このように変換されずにもともとのURLのままアクセスされる結果となる。
一方で、
http://class-3b.ryoou-gakuen.ac.jp/washimiya-jinja/hoge.html
↓
http://www.washimiya-jinja.org/hoge.html
という書き換えは実行され、
http://class-1d.ryoou-gakuen.ac.jp/washimiya-jinja/hoge.html
↓
http://www.washimiya-jinja.org/hoge.html
こちらもこの書き換えが実行される。
1個目のRewriteRuleはRewriteCondの制御対象になっているが、2個目のRewriteRuleはRewriteCondの制御対象になっていないため、このような書き換えが行われるのである。
RewriteCondを複数列挙した場合、1個でも評価を満たさない場合、続くWriteRuleの実行がキャンセルされることとなる。
例を示そう。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} (^DoCoMo/|.*UP\.Browser|^J-PHONE/|^Vodafone/|^SoftBank/|^MOT-[CV]980)
RewriteCond %{HTTP_HOST} teachers-room\.ryoou-gakuen\.ac\.jp
RewriteRule (.*) /mobile_contents/$1 [R]
たとえば上記のような設定があったとする。
RewriteCondが2個あるが、この2個のRewriteCondの評価結果が共にマッチした場合だけ、RewriteRuleによるURLの書き換えが実行される。
1個目のRewriteCondでは、クライアントのブラウザが何であるかをチェックしている。具体的には携帯電話のブラウザ(フルブラウザじゃない)かどうかをチェックしている。
2個目のRewriteCondでは、サーバ名に「teachers-room.ryoou-gakuen-ac.jp」が指定されているかどうかをチェックしている。
つまり…携帯電話のブラウザでhttp://teachers-room.ryoou-gakuen.ac.jpにアクセスしてきた場合にRewriteRuleの書き換えが実行され、/mobile_contents/配下のコンテンツにアクセスするようにリダイレクトされている。
さて。RewriteCondの評価パターンには正規表現を記述するので、「マッチしなかった場合」という記述も可能である。
たとえば、「teachers-room.ryoou-gakuen.ac.jp」以外のURLを一斉にリダイレクトしたい…という場合なら
RewriteCond %{HTTP_HOST} !teachers-room\.ryoou-gakuen\.ac\.jp
というようになる。
さて。RewriteRuleの本領はここから発揮されるのであった。
CGIを自作したことがある人なら知っていると思うが、Apache2をはじめとするWebサーバは、CGIに対して”環境変数”を通じて様々な情報を通知する機能を有している。
たとえば、「HTTP_USER_AGENT」は、そのCGIにアクセスしてきたクライアントのブラウザに関する情報を通知する変数であるし、「HTTP_REFERER」は、そのCGIへのリンクが張られていたページのURLを通知する変数である。
こうした環境変数を評価してRewriteRuleを実行する/しないの制御を行うことも可能なのであった。そのためのディレクティブを紹介する。
RewriteCond 評価対象 評価パターン
このRewriteCondディレクティブは、RewriteRuleディレクティブの前に1個以上記述する。すると、RewriteCondの評価内容をチェックし、当てはまらない場合には、このRewriteCondに続く最初に遭遇したRewriteRuleディレクティブの実行をキャンセルするようになる。
言葉だけで書いているとなんか判りづらいので、実例を挙げてみよう。
RewriteEngine on
RewriteCond %{HTTP_HOST} class-3.\.ryoou-gakuen\.ac\.jp
RewriteRule ^/lucky-star/(.*) /graduate/$1 [R]
RewriteRule ^/washimiya-jinja/(.*) http://www.washimiya-jinja.org/$1 [R]
こんな設定があったとしよう。この例で示したRewriteCondディレクティブは、ホスト名をチェックしている。変数「HTTP_HOST」の内容が、class-3.\.ryoou-gakuen\.ac\.jpとマッチするかしないかを判定しているが、マッチした場合には、URLの「/luck-star/」を「/graduate/」に書き換えるRewriteRuleが実行される。しかし、マッチしなかった場合はそのRewriteRuleの書き換えは実行されない。
しかし、「/washimiya-jinja/」を「http://www.washimiya-jinja.org/」にリダイレクトするRewriteRuleは、RewriteCondの判定結果にかかわらず必ず実行されるのであった。
つまり。
http://class-3b.ryoou-gakuen.ac.jp/lucky-star/hoge.html
↓
http://class-3b.ryoougakuen.ac.jp/graduate/hoge.html
という書き換えが発生するが、
http://class-1d.ryoou-gakuen.ac.jp/lucky-star/hoge.html
↓
http://class-1d.ryoou-gakuen.ac.jp/lucky-star/hoge.html
と、このように変換されずにもともとのURLのままアクセスされる結果となる。
一方で、
http://class-3b.ryoou-gakuen.ac.jp/washimiya-jinja/hoge.html
↓
http://www.washimiya-jinja.org/hoge.html
という書き換えは実行され、
http://class-1d.ryoou-gakuen.ac.jp/washimiya-jinja/hoge.html
↓
http://www.washimiya-jinja.org/hoge.html
こちらもこの書き換えが実行される。
1個目のRewriteRuleはRewriteCondの制御対象になっているが、2個目のRewriteRuleはRewriteCondの制御対象になっていないため、このような書き換えが行われるのである。
RewriteCondを複数列挙した場合、1個でも評価を満たさない場合、続くWriteRuleの実行がキャンセルされることとなる。
例を示そう。
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} (^DoCoMo/|.*UP\.Browser|^J-PHONE/|^Vodafone/|^SoftBank/|^MOT-[CV]980)
RewriteCond %{HTTP_HOST} teachers-room\.ryoou-gakuen\.ac\.jp
RewriteRule (.*) /mobile_contents/$1 [R]
たとえば上記のような設定があったとする。
RewriteCondが2個あるが、この2個のRewriteCondの評価結果が共にマッチした場合だけ、RewriteRuleによるURLの書き換えが実行される。
1個目のRewriteCondでは、クライアントのブラウザが何であるかをチェックしている。具体的には携帯電話のブラウザ(フルブラウザじゃない)かどうかをチェックしている。
2個目のRewriteCondでは、サーバ名に「teachers-room.ryoou-gakuen-ac.jp」が指定されているかどうかをチェックしている。
つまり…携帯電話のブラウザでhttp://teachers-room.ryoou-gakuen.ac.jpにアクセスしてきた場合にRewriteRuleの書き換えが実行され、/mobile_contents/配下のコンテンツにアクセスするようにリダイレクトされている。
さて。RewriteCondの評価パターンには正規表現を記述するので、「マッチしなかった場合」という記述も可能である。
たとえば、「teachers-room.ryoou-gakuen.ac.jp」以外のURLを一斉にリダイレクトしたい…という場合なら
RewriteCond %{HTTP_HOST} !teachers-room\.ryoou-gakuen\.ac\.jp
というようになる。
コメント 0