BBRK 05-02-09


ドメイン名 変更(その3)  

mod_rewrite のエライ人(って、誰?)とお友達になりたい今日この頃(苦笑)

実はここ一週間ほど、仕事から帰宅してから就寝までの短い時間(笑)の多くを費やしては悩んでいたことがあったのですが、今日、それがようやく解決しました(苦笑)
それは、「ドメイン名の移転のためのリダイレクト」と「BBRK日別表示を統一させるための小細工(笑)」の両方を満足する .htaccess の記述方法だったりします。早い話が、mod_rewrite の使い方ですな。

+   +   +   +   +

「ドメイン名の移転のためのリダイレクト」と「BBRK日別表示を統一させるための小細工(笑)」の要件をまとめると、次の 4点となる。

  1. 旧ドメイン名でアクセスしてきたら、新ドメインに飛ばす。
    レスポンスコード301(Moved Permanently)で外部リダイレクトを発生させる。このレスポンスを受けたブラウザは、新しいURLに自動的にアクセスしなおす。
  2. BBRK日別表示対応。
    例えば、http://www.unknown24.net/bbrk/20050101http://www.unknown24.net/bbrk/bbrkview.cgi?date=20050101 に書き換える
  3. BBRK日別表示統一用(その1)。
    例えば、http://www.unknown24.net/bbrk/20050101.html というアクセスの仕方を禁止し、正しいアクセス方法を表示する。
  4. BBRK日別表示統一用(その2)。
    bbrkview.cgi を直接呼び出すことを禁止する。例えば、http://www.unknown24.net/bbrk/bbrkview.cgi?date=20050101 というアクセスの仕方を禁止し、正しいアクセス方法 http://www.unknown24.net/bbrk/20050101 を表示する。

+   +   +   +   +

上述の要件を満たす .htaccess
2箇所の .htaccess に次のような Rewriteに関する記述を追加。

www.unknown24.net/.htaccess

1
2
3
4
# For domain transfer petepete.net -> unknown24.net
RewriteEngine on
RewriteCond %{HTTP_HOST} petepete\.net
RewriteRule (.*) http://www.unknown24.net/$1 [R=301,L]

解説(笑)
1行目‥単なるコメント(笑)。この記述は何のためにあるのかを書いておく。こうしておかないと後日すぐに思い出せなかったりするので(苦笑)
2行目‥Rewrite機能を onにする。ちなみに、この記述の有効範囲は記述されている .htaccessファイル内のみ。
3行目‥3行目の条件がマッチしていたら 4行目の処理を行う。
3行目で指定している条件は、環境変数 HTTP_HOST に petepete.net があるかどうか。あれば 4行目の処理を行い、無ければ何も起こさない。
4行目‥3行目がマッチした場合、(.*) がチェックされ、http://www.unknown24.net/$1 [R=301,L] に置換される。(.*) はどんな文字列でもマッチするので、ここでマッチした文字列が $1 の場所に置き換えられて作られた URL、つまり http://www.unknown24.net/○○ に対して外部リダイレクトをレスポンスコード 301(Moved Permanently)で発生させる。301 を指定せず [R,L] とするとデフォルトである 302(Moved Temporarily)のレスポンスコードを添えたリダイレクトとなる。検索エンジンのクローラの動作を考慮し、301 を返すように設定した。Lフラグはこの場合書く必要はないが、習慣として書いておいた(笑)

www.unknown24.net/bbrk/.htaccess

1
2
3
4
5
6
7
8
9
10
11
12
# For domain transfer petepete.net -> unknown24.net
RewriteEngine on
RewriteCond %{HTTP_HOST} petepete\.net
RewriteRule (.*) http://www.unknown24.net/bbrk/$1 [R=301,L]

# For BBRK one-day viewer
#RewriteEngine on
RewriteBase /bbrk/
RewriteRule ^([1-9][0-9]{7})$ bbrkview.cgi?date=$1 [L]
RewriteRule ^([1-9][0-9]{7})\.html gaga.cgi?date=$1 [L]
RewriteCond %{THE_REQUEST} bbrkview\.cgi
RewriteRule bbrkview\.cgi gaga.cgi [L]

解説(笑)
1〜4行目‥上と同じ。サイトトップの .htaccess と重複する記述を書く(*1)。
6行目‥コメント。
7行目‥コメント。サイト移行期間が過ぎたら、petepete.net というドメイン名を消滅させる予定なので、そうなると新ドメインへのリダイレクト設定は不要となる。その場合 1〜4行が不要になるため削除することになるが、そうなると Rewrite機能を onにする記述を入れ忘れ、動かずにしばし悩むことになりそうゆえに気が付くように入れてある(苦笑)。コメントにせずに記述しておいても問題はないが、余計な処理は外す主義なのでコメントアウトしておいた(笑)
8行目‥/bbrk/ がベースであることを指示。.htaccess の置いてある場所のディレクトリが /bbrk なので、記述しなくても動作するが念のため。
9行目‥BBRK日別表示用。例えば、http://www.unknown24.net/bbrk/20050101 という URLでアクセスがあったとしたら、それを http://www.unknown24.net/bbrk/bbrkview.cgi?date=20050101 に書き換え、Lフラグにより 10〜12行の変換処理をスキップしてすぐさま内部リダイレクトを起こす。
10行目‥BBRK日別表示統一用。例えば、http://www.unknown24.net/bbrk/20050101.html という URLでアクセスがあったら、それを http://www.unknown24.net/bbrk/gaga.cgi?date=20050101 に書き換え、Lフラグにより 10〜12行の変換処理を行わずに内部リダイレクトを起こす。なお gaga.cgi では、日別内容の表示を行う前にリンクの仕方を変更するお願い文を表示させるということを行う。
11行目‥環境変数 THE_REQUEST に bbrkview.cgi という文字列があったら、次の行(12行目)の処理を行う。なお、THE_REQUEST にはブラウザから webサーバに送られた HTTPリクエストの完全なもの(例えば GET /bbrk/bbrkview.cgi?date=20050101 HTTP/1.1)が入っている。
12行目‥bbrkview.cgigaga.cgi に置換する。これは、bbrkview.cgi を直接指定して アクセスしてきたひとにリンクの仕方を変更するお願い文を表示させるのが目的。Lフラグはこの場合書く必要はないが、習慣として書いておいた(笑)

*1
サイト全体に関する記述をサイトトップの .htaccess に記述し、BBRKに関するものだけを bbrk ディレクトリの .htaccess に記述する…というのが美しいのですが、mod_rewrite の仕様上それは出来ないんですね。いや、実は、RewriteOptions inherit という命令が用意されていて、これを記述することで上位ディレクトリにある .htaccess の Rewrite記述を引き継ぐということが出来たりするのですが、使いこなせなかったので見送りました(苦笑)

+   +   +   +   +

苦労した点とか注意点

■関連記事
BBRK 05-01-29 : ドメイン名 変更
BBRK 05-01-30 : ドメイン名 変更(その2)


BBRK に戻る / BBRK 05-02-09 の全記事に戻る