すたらブログ

文系Webプログラマの備忘録

htaccess: ひとつのフォルダに複数のサイトが混在する状況において、主サイトを管理しやすくする

状況

下記のように、ひとつのFQDN(完全修飾ドメイン名)の下に、主サイトと別のサイトとが混在している。
このままでは管理に手間がかかる。
たとえば、主サイトに対してFFFTPミラーリングアップロードを実行できない。

サイト構造
  • http://www.example.com/
    • index.html (主サイトのページ)
    • foo.html (主サイトのページ)
    • bar.html (主サイトのページ)
    • css/ (主サイトの外部CSS)
    • js/ (主サイトの外部JavaScript)
    • img/ (主サイトの画像)
    • blog/ (ブログ 主サイトとは別)
    • sub1/ (子会社のサイト 主サイトとは別)
    • sub2/ (子会社のサイト 主サイトとは別)

改善案

主サイトもひとつのフォルダに収めたい。
また、さらに日付ごとのサブフォルダを設けることで、全面リニューアルなどを安全かつ円滑に行えるようにしたい。

サイト構造
  • http://www.example.com/
    • main/
      • 20150601 (日付)
        • index.html (主サイトのページ)
        • foo.html (主サイトのページ)
        • bar.html (主サイトのページ)
        • css/ (主サイトの外部CSS)
        • js/ (主サイトの外部JavaScript)
        • img/ (主サイトの画像)
    • blog/ (ブログ 主サイトとは別)
    • sub1/ (子会社のサイト 主サイトとは別)
    • sub2/ (子会社のサイト 主サイトとは別)

htaccessの利用目的

上の改善案だけでは、主サイトの各ページへの階層が深くなってしまう。
そこで、htaccessでURLの書き換え(リライト)を行う。
なお、見た目上のURLには全く影響はない。

  • 要求されたURL: http://www.example.com/index.html
  • サーバが探す場所: /main/20150601/index.html

htaccessの記述

# .htaccess (ドキュメントルート直下に置く)

# リライトを有効にする
RewriteEngine On

# 主サイトとは別のサイトはリライトしない。
# また、無限ループを防ぐために`main/`へのアクセスもリライトしない。
# なお、主サイトに下記の除外リストと一致するファイルやフォルダがないことを確認する。
RewriteCond %{REQUEST_URI} !^/(main|blog|sub1|sub2) [NC]

# 主サイトへのアクセスのみ、サーバが探す場所を変更する
RewriteRule ^(.*)$ /main/20150601/$1 [L]
参考: 各フラグの意味