サブディレクトリに移動したコンテンツをサブディレクトリ無しでアクセスできるようにリダイレクトする
今日やったお仕事の記録。
既存のサイトをWordPress化してルートディレクトリに2014と言うサブディレクトリを作ってその中にインストールする、ということらしい。
そして、テスト様に
http://example.com/2014
というアドレスにアクセスすると、運用前のサイトがクライアント様確認様に表示されるようにしたい、ということらしい。
最終的には、ディレクトリはそのままで、http://example.com/で公開するらしい。
とりあえずパーマリンクも正常に動かないので、それを直すところから始めた。.htaccessのパーミッションが足りなかったのか.htaccessに管理画面>設定>一般で「WordPress アドレス (URL)」「サイトアドレス (URL)」の設定が反映されていなかったので、.htaccessのパーミッションの666にしてから「一般」や「パーマリンク設定」の設定更新を再度行ってみたところ.htaccessに必要な設定が自動的に追加されパーマリンクが上手く働くようになった。
それまでは、ページが無いとウェブサーバに怒られる状態だった。
実際の作業はここまでのはずだったのだけど、最終的にはhttp://example.com/で公開するので、テンプレート内のリンクの記述は2014を含まない形で書かれているため、homeに戻るリンクを押すと既存のページに戻ってしまうし、その他の各ページもリンク切れ状態になってしまっている。そのままお客さんにサイトを確認してもらうわけにもいかないと思うので、テンプレート側で対応してもらおうと思ったけど、個別ページのページ数も多くリンクの修正も大変だと思われたのでリダイレクトで対応できないか考えてみた。
既に、example.comで既存のサイトが存在しているのでこれに影響を与えないように、テスト環境を動かすように設定が必要。
しかし、テストの環境のリンクは、本来、
http://example.com/2014/abc/
であるところが、
http://example.com/abc/
みたいに2014を含まない形になっているので、既存のサイトと同じ階層になるので、特にhttp://example.com/へのリンクは既存のサイトがあるので別々の表示なんて無理かなーとも思ったのだが、以下の方法で解決した。
example.comのルートディレクトリにある.htaccessにmod_rewriteで以下のリダイレクト設定を追加した。
RewriteEngine on
RewriteCond %{HTTP_REFERER} 2014
RewriteCond %{REQUEST_URI} !2014
RewriteRule ^(.*)$ http://example.com/2014/$1 [R,L]
リファラをチェックすることにした。
つまり、http://example.com/2014/でテスト用のURLにアクセスした場合、テスト用のトップページが表示される。そしてリファラはhttp://example.com/2004/となり2014を含んだ形になる。
つまり、リファラに2014が含まれていればテスト用のサイトだと判断するようにした。REQUEST_URIをチェックしているのはループしないようにするため。
RewriteCondはただ単に並べるとAND条件になる。
リファラに2014が含まれ、且つ、URLに2014が含まれなければhttp://example.com/2014/にリダイレクトするようにした。
これでうまくいった。
しかし、実際にはしばらくハマった。それは、ブラウザのキャッシュが思いの外強力で、一度キャッシュをクリアしないと元のリダイレクト設定がされていない状態と同じように既存のサイトが表示されてしまっていた為に、リダイレクトの設定がうまくいかないと思い込んでいたためだ。
ブラウザのキャッシュを一度クリアしたらちゃんと動いて、今までの苦労はなんだったんだ……(´・ω・`)となった。
タグ : .htaccess, apache, mod_rewrite, WordPress, リダイレクト