htaccessで301転送

前回の記事でPlesk×ApacheでhtaccessのIP制限をやろうとしてすげー苦労した事を書きましたが、

Plesk11入りwebサーバーでアクセス制限


2ヶ月ほど経って今度はApacheのみなのにhtaccessの301転送ですげー苦労したので覚え書きとして。

まず、今回の状況。というかやりたいこと。

  1. 本体サイトのサーバー移転の間(数時間)だけサーバーを貸してほしい
  2. 借りたサーバーでは特に何もすることは無く、コンテンツ(例えば/contact/等)にアクセスしてきた人に対して、サーバー作業中のお知らせを出してほしい
  3. サイトは全部で3つ。バーチャルホストでいい

という事だったので

  1. バーチャルホストで3つのwebサイト分のディレクトリを用意。
  2. 移転のお知らせをhtmlで作成。会社のサイトなのでロゴやCSSももらってそれなりの体裁に。
  3. 出来上がったhtmlに対して301転送をかけ、下層ディレクトリにアクセスしてきたら自動でTOPの階層のhtmlに飛ばす。

というのを考えてみた。
2番まではまあ、いつもの事なので特に滞りなく進んだ。
問題は3番の301転送。
これがリダイレクトループとの終わりなき戦争の始まりだった。

まずhtaccessに↓こんなことを書いてみた。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/$)
RewriteRule ^(.*)$ / [R=301,L]

適当に/test/とか叩いてみると、TOPの階層のindexにちゃんと飛ぶ。
しかし、なんかデザインがおかしい。
画像はリンク切れになり、CSSで指定してるはずの枠とか色とかもついてない。
地は裂け、海は枯れ、鳥たちは歌うことをやめた。
まぁ最後の行はウソとして、cssやimageディレクトリを見てくれていないようだ。
ここで大事なことに気付く。

「TOPディレクトリのindex以外へのアクセスを全部indexに飛ばす=/cssや/imageも飛ばしちゃってる」

試しに/css/header.cssとかを表示してみると、丁寧にindexを表示してくれた…。

こらアカンってなって301転送で特定のディレクトリへのアクセスだけ除外する方法を探した。
するといくつか出てくるので、以下のサイトを参考に.htaccessを修正。

.htaccessの301リダイレクトで、特定のディレクトリを除外する方法

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !(^/css/)
RewriteCond %{REQUEST_URI} !(^/image/)
RewriteRule ^(.*)$ / [R=301,L]

う~ん、リダイレクトループ…。
何故だ…みんなできてると言うのに…。
調べまくったところ、以下のサイトに興味深い事が書いてあった。

http://tmopro.jugem.jp/?eid=185

>RewriteCond %{REQUEST_URI} !^/index.html$   ←自分自身は除外(これがないとループ!!)
これや…兄さん、これや!
これが抜けとったんや!。

てなワケで最終的に.htaccessを↓のように修正。

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteCond %{REQUEST_URI} !(^/css.*)
RewriteCond %{REQUEST_URI} !(^/image.*)
RewriteRule ^(.*)$ /index.html [L,R=301]

オメデトウ!ばっちり意図した通りになったよ!
.htaccessは結構使うのに忘れがちなので気を付けます。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)