So-net無料ブログ作成
検索選択

たぶん難しくないApache2・挑戦!RewriteRule・その1~基礎編:リダイレクトしてみる~ [Linux(Apache)]

 私的にWebサーバを立てているような人の中でどの程度、RewriteRuleのお世話になる人がいるのか、とっても疑問ではあるものの、会社内の部門サーバとかそういうところではある程度の需要はあるんじゃないかと思ったりもするので(笑)、ここで紹介してみたいと思う。

 で、「RewriteRule」ってそもそもなんなのよ?   という話からはじまるのでありました。

 簡単に言ってしまうと、決められた法則にしたがって、URLを書き換えるという機能であると理解してもらって、ほぼ差し支えない。
 たとえば、URLに記述されているパス名をCGIの引数に書き換える(読み替える)とか、URLに記述されているパス名から、適用されるバーチャルサーバを変更するとか、アクセスしてきたクライアントアドレスやFQDN、ブラウザ等の情報に応じて見せるコンテンツ(URL)を変更するとか、とにかくいろいろ出来てしまうのである。
 ただ、「いろいろ出来てしまう」故にぱっと見に難解な印象を持たれてしまって損をしているというところもあるかもしれない。(笑)

 RewriteRuleの使用には、正規表現に対する深く正しい理解が欠かせない。ところが、この「正規表現」もどちらかというと避けられがちなアイテムであったりするので余計にRewriteRuleの敷居を高くしてしまっているフシがあるのもまた事実。悲しいことだけども。(笑)

 ここではまず、RewriteRuleの簡単な使い方等を紹介しつつ、余裕があれば(笑)そのほかのバリエーションなども説明してみたいと思う。

 それではまず、ここで登場するディレクティブを紹介する。2つある。まず一つは
RewriteEngine on … RewriteRuleの機能を有効にする。「on」の部分を「off」にすればRewriteRuleの機能を無効にする。「off」はRewriteRuleのデバッグの時に使うかな…程度だと思う。

 2つ目はメインディッシュである。
RewriteRule 置換前のパターン 置換後の文字列 フラグ
 実際にURLの書き換えを行うディレクティブ。最大で3つの引数を取るが、最後の「フラグ」は省略可能である。(でもあまり省略しない気がする…)

 「置換前のパターン」とは、入力されたURLが、このパターンに一致するかどうかチェックが行われる。たとえば、このパターンに「^/ryoou-gakuen/」と指定されていた場合、URLが「http://server/ryoou-gakuen/hogehoge.html」とかいうケースではこのRewriteRuleが適用されるが、「http://server/washimiya-jinja/hogehoge.html」だった場合には適用されないことになる。

 「置換後の文字列」とは、上記のチェックに一致した場合に書き換えるURLの文字列(パターン)を記述する。細かいことは追って解説することにしよう。

 「フラグ」とは、RewriteRuleによってURLの書き換えを行った後の振る舞いをどうするか…というような指定を行う。この項目の存在によって、RewriteRuleが多様な処理を行うことが出来るようになっているが、逆にこの項目の存在がRewriteRuleを難解に感じさせてしまっているようにも思う。フラグについても追って解説することにする。

 では、とにかくお手軽なRewriteRuleの例から。「serverA」のhttpd.confにこう記述したとする。

RewriteEngine on
RewriteRule (.*) http://serverB/$1 [R]

 serverAにあったコンテンツが丸ごとごっそりとserverBに引っ越しました…という場合でも想定してもらえばよいだろうか。serverAの中にあるありとあらゆるコンテンツに対するリクエストを、serverBの同じパス位置にリダイレクトしている。

 「置換前のパターン」の位置にくるのは、サーバ名を除いたパス名の部分がチェックされる対象となる。たとえば、「http://serverA/ryoou-gakuen/hogehoge.html」というURLの場合は、「/ryoou-gakuen/hogehoge.html」がパターンの検査対象になっているということ。
 上記のRewriteRuleディレクティブでは、「(.*)」と指定されていることから、0文字以上の任意の文字列がマッチすれば、RewriteRuleが実行される…ということになる。カッコで囲まれているが、これには意味がある。詳しくは正規表現の解説書等を読んでもらいたい(笑)が、カッコで囲まれた部分はRewriteRuleディレクティブの「置換後の文字列」の部分で再利用が出来るようになるイメージ。上記の例では、「http://serverB/$1」と記述しているが、この「$1」の部分に、カッコで囲まれた正規表現にマッチした内容が代入されるのである。

 http://serverA/ryoou-gakuen/hoge.htmlのアンダーラインの部分が「(.*)」の「.*」にマッチする。このマッチした部分がカッコで囲まれているので、変数「$1」に保存される。
 ↓
 置換後の文字列で、http://serverB/$1としているので、変数$1が展開され、http://serverB/ryoou-gakuen/hoge.htmlとなる…という寸法。

 わかったかな??

 では、http://serverA/ryoou-gakuen/ と、http://serverA/washimiya-jinja/ というディレクトリがあったとして、「/ryoou-gakuen/」の配下だけserverBに移転しました…という場合はどうすればよいか。

RewriteEngine on
RewriteRule ^(/ryoou-gakuen/.*) http://serverB/$1 [R]

 こういうことになる。

 では、「ディレクトリが移転しました」という場合。
 このような場合はaliasディレクティブを使っても良いのだけども、RewriteRuleで対応するなら、基本パターンとしては…

RewriteEngine on
RewriteRule ^/旧ディレクトリ/(.*) /新ディレクトリ/$1 [R]

 というパターンになるだろうか。ディレクトリの深さも変更することが出来る。たとえば、/ryoou-gakuen/ディレクトリを、/lucky-star/の下に配置した場合(結果的に「/lucky-star/ryoou-gakuen/」ということになる)

RewriteEngine on
RewriteRule ^(/ryoou-gakuen/.*) /lucky-star/$1 [R]

 という具合。

 ここで、ちょっと注意が必要。RewriteRuleディレクティブに渡す最初のパターンは、grepコマンドのパターン指定と同じ感覚でマッチングが行われる。このため

RewriteRule /ryoou-gakuen/(.*) /lucky-star/$1 [R]

 このように記述した場合は、URLに
 http://server/ryoou-gakuen/hogehoge.html
 http://server/lucky-star/ryoou-gakuen/hogehoge.html
 http://server/otherDirectory/ryoou-gakuen/hogehoge.html
 上記のいずれも置換の対象になってしまうので注意が必要。その理由が判らない人はもう一度grepコマンドの勉強をしてくるように!!

nice!(2)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 2

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この記事のトラックバックURL:
※ブログオーナーが承認したトラックバックのみ表示されます。
メッセージを送る