Kawanet Blog II

アクセスカウンタ

zoom RSS ワイルドカードなサブドメインの可否をファイルで判断して 404 Not Found を返す

<<   作成日時 : 2009/02/28 05:30   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

Apache でユーザごとの専用サブドメイン(ワイルドカードレコード) の記事で書いたのは、
『foobar ユーザ用のサブドメインを foobar.example.com としたとき、
http://foobar.example.com/foobar.html にアクセスされた場合、
/path/to/htdocs/foobar.example.com/foobar.html がなければ、デフォルトで
/path/to/htdocs/www.example.com/foobar.html の共通ファイルを返す』
ための httpd.conf の設定例でした。
 
実際には、JS や CSS とかの各ドメインで共通に使う静的ファイルについては、
キャッシュがちゃんと効くように、専用 URL を作ってそこに置いたほうが良い。

さて今回は、『同様のワイルドカードAレコードなマルチユーザ対応環境で、
ファイルベースのユーザの存在確認を行って、ユーザが存在しない場合に
デフォルトの共通ファイルを(200 OK ステータスで)返すのではなくて、
404 Not Found ステータスを返す』ための設定例です。

<IfModule mod_setenvif.c>
    SetEnvIf Host "^([^\.]*)\.example.com" SUBDOMAIN=$1
    RewriteCond %{ENV:SUBDOMAIN} .
    RewriteCond /path/to/db/%{ENV:SUBDOMAIN}.db !-f
    RewriteRule ^/ / [R=404]
</IfModule>

mod_rewrite に加えて、mod_setenvif モジュールが必要です。
サブドメイン名(=ユーザ名)を環境変数 SUBDOMAIN に入れています。

foobar ユーザ用のサブドメインを foobar.example.com としたとき、
/path/to/db/foobar.db ファイルが存在する場合は通常通り処理して、
/path/to/db/foobar.db ファイルが存在しない場合は、
foobar.example.com サブドメイン全体で 404 Not Found エラーを返します。
[R=404] の値を変更すれば、その他のステータスも返却できます。
[R] だけにして、指定した外部 URL にリダイレクトさせるのもできますね。

ユーザごとに1ファイルずつを設置している必要がありますが、
Apache+ファイルテストだけでユーザの存在確認が可能になります。
ユーザ存在確認のために、リクエストの度に DB 接続するプログラムを
起動しなくて済んで、中規模のサイトに優しい気がする。
また、!-f を !-d にすれば、ディレクトリで存在確認することも可能です。

1フォルダに並べたくないほどに、ユーザ数が増えてしまった場合は、
とりあえず、ユーザ名の先頭の文字とかで刻んで行くとか。

    SetEnvIf Host "^(.)" CHAR1ST=$1

あるいは、ファイルシステムとしてマウントできる DB はないかな?

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
ワイルドカードなサブドメインの可否をファイルで判断して 404 Not Found を返す Kawanet Blog II/BIGLOBEウェブリブログ
文字サイズ:       閉じる