にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:24:21.

mod_rewriteモジュールを使ってURLを書き換えたい

私が利用している「さくらインターネット」というレンタルサーバ会社では、mod_rewriteを使うことができます。料金が安いのに、なかなか便利なサーバです。

mod_rewriteというのは、Apacheのモジュールで、正規表現を使ってURLを書き換えるものです。
これを活用すると、CGIで動的に生成されたページを、あたかも静的なページであるかのように見せることもできます。

例えば、
http://www.example.com/bbs.cgi?page=3&mode=view&style=flat
…みたいな、どっから見ても動的に生成してるとしか思えないURLを
http://www.example.com/bbs/3/view/flat/
…みたいな、一見静的なページのURLなように見せることができたりします。

まあ、mod_rewriteの用途はそれだけじゃないでしょうけど、そんな用途にも使われます。(Amazon.co.jpも、そんな感じですよね。)

上記の変換をmod_rewriteで実現するには、.htaccessファイルに次のように書いておけば良さそうです。

RewriteEngine on
RewriteRule ^([0-9]+)/(.+)/(.+)/$ bbs.cgi?page=$1&mode=$2&style=$3 [L]

…たったこれだけ。
1行目は、mod_rewriteを有効にするための記述で必須。
2行目は、実際にURLを書き換える正規表現。
2行目の最後の「 [L] 」というのは、そこでURLの変換を終了するという意味。この場合、3行目以降は存在しないので、書かなくても一緒だと思いますが。

mod_rewriteというモジュールも大変便利なんだけど、正規表現の威力もすごいですよね。Perlなんかで正規表現を使うたびに思うんですけど。正規表現を考えた人もすごいけど、これを実装した人もすごいと思います。(笑)

で、まあ、上記のように .htaccessファイルに書いておけば、URLの書き換えができるわけです。…のハズなんだけど…。
できませんでした…。orz

mod_rewrite解説サイトとか、いろんな人のブログとか見てても、上記の記述で良さそうだと思えるんですけど、なぜかうまくいきません…。
.htaccessファイルが読まれてないんじゃないか!?とか思ったりしたんですけど、他の記述 ErrorDocument とかを記述してみるとちゃんと反映されるので、.htaccessファイル自体は読まれてるんですよね。

じゃあ、なんでURLが書き換えられないのか!

…いろいろ試行錯誤した結果、どうも「書き換え後のURL」を、「 http:// 」から書けば、うまくいくようでした。
つまり、以下のような感じ。

RewriteEngine on
RewriteRule ^([0-9]+)/(.+)/(.+)/$ http://www.example.com/bbs.cgi?page=$1&mode=$2&style=$3 [L]

これなら、うまくいきました。(↑ウインドウ幅によっては3行以上あるように見えるかも知れませんが、ソース的には『2行』です。)
なんで「http://」から書く必要があるのか、よく分かりませんが。
しかしまあ、この書き方ならうまくいったので、いいんですけど。
バーチャルホストだから、ダメだとか?(関係ないよねえ?^^;;;)

以下、参考にしたサイト群。

コメント

>なんでURLが書き換えられないのか
RewriteBaseはいかがでしょう?
もし解決済みでしたらごめんなさい(汗

投稿者 とんぼ : 2006年05月29日 09:23

とんぼさん、どうもです。
コメントありがとうございます。まだ解決はしてない…というか、まあhttpから書けばうまくいくので問題ないとして、放置しているのですが。(^^;;;
なんとなく、変換先は絶対URL(httpで始まる必要はないけど)でないとダメっぽいような気がします。
www.nurs.or.jp/~sug/homep/rewrite/rewrite15.htm
ここら辺↑を読むと、なんとなくそんな感じが。

投稿者 にしし : 2006年05月30日 23:01

2行目にRewriteCond %{REQUEST_FILENAME} !-f

を挿入されてみてはいかがでしょうか?
末尾の「!-f」で、「『REQUEST_FILENAME』(リクエストさ
れたファイル名)が存在しないならば」という意味で3行目の
内容が読み込まれる仕組みのようです。
自分はこれを挿入したら相対アドレスでも稼動いたしました。

投稿者 とど : 2006年09月03日 14:55

とどさん、どうもです。
おー。これは有用な情報をどうもでした!
試してみます!

投稿者 にしし : 2006年09月04日 02:24

なぜか、このページ『だけ』にロシア語のスパムが頻繁に届くので、このページのコメント機能をOFFにしました。
何か書きたいコメントがありましたら、他のmod_rewriteネタを扱っているエントリのコメント欄などをご活用下さい。(^_^;;;
→ www.nishishi.com/blog/2006/01/dynamic_to_stat.html
とかがあります。

投稿者 にしし : 2008年11月30日 11:52

コメント数: 5件

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---