mod_rewrite : してログ

サイトのドメイン移転で使われる「301リダイレクト」を設定してみて、あれって思ったことがあった今日この頃。 実は、このサイト自体のドメインを landhere.info から landhere.jp に移転することにして、mod_rewrite でリダイレクトを設定したんです。

なぜかリダイレクト後の URL に「/」がひとつ多い

いろんなサイトに紹介されている下記のような設定を記述してみました。 ちなみに、ドメイン移転だけなので .htaccess は使わずに、httpd.conf の VirtualHost に書いてみました。

RewriteEngine on
RewriteRule (.*) http://landhere.jp/$1 [R=301,L]

実際にブラウザで確認してみると、「http://landhere.info/blog/」が「http://landhere.jp//blog/」にリダイレクトされるのを確認。 でも、よく見ると「/」がひとつ余計である。 前に設定したときは、こんなことは無かったと思うけど、最新バージョンでは挙動が異なるのか何なのか、とりあえず。

RewriteEngine on
RewriteRule (.*) http://landhere.jp$1 [R=301,L]

このように変更して解決しました。 まあ、少し嵌ったんですが。

設定を変更してもリダイレクト結果が変わらない

設定を変更した後、再びブラウザでテストしても同じリダイレクト先に飛ばされます。 正規表現を弄ったりしても、何しても結果は変わらず、しばらく悩んだ末。 大胆にリダイレクト先ドメイン名を www.yahoo.co.jp にしてみよう、というのを試してみてやっと分かった。 ブラウザがひと度、301リダイレクトを受け取ってしまうとキャッシュしてしまう、というのが真相らしい。 と言う訳で、キャッシュクリアを実行して正しいリダイレクトが行われるのを確認しました。 くだらない事で消費した時間を返して欲しいです。

キャッシュファイル処理などでよく使う手法で、mod_rewrite を使い実ファイルが存在していればそれを表示し、まだ作成されていなかったらスクリプトを動かしてレスポンスを返しつつファイルを保存する、という常套手段があります。それを実現するには、下記のようにしますが、少し盲点があります。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.html)$ /_system/doc.php?d=$1
RewriteRule ^(.+\.htm)$ /_system/doc.php?d=$1

一行目の指定は、実ファイルがあれば RewriteRule を適用しない、という意味になりますが、これは直後の RewriteRule にしか効かないため、三行目の指定は実ファイルがあってもスクリプトが常に動くことになります。三行目も同様にしたい場合は、下記のように書きます。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.html)$ /_system/doc.php?d=$1
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+\.htm)$ /_system/doc.php?d=$1

分かっていないと「何で~」と悩むに違いない盲点です。