WebARENA SuiteXでは、マルチドメインをApacheのmod_rewriteモジュールで実現している。homeにアクセスしてきたセッションを、強制的にマルチドメイン用のディレクトリにリダイレクトさせるわけだ。サブドメインも同様で、例えば、example.comドメインにサブドメインを2つ設定したとする。
sub1.example.com
sub2.example.com
この場合はサイトマネージャーの「子ドメインの追加と削除」でサブドメインをDNS登録し、「マルチドメイン設定ツール」でhome直下に置く.htaccessを生成する。WebARENA SuiteXでは、サブドメインと同じ名前のディレクトリをhome直下に作成し、そこにコンテンツを置くことになっている。sub1.example.comのコンテンツなら、/home/sub1.example.com/に置くわけだ。このとき http://example.com/sub1.example.com/ へ直接アクセスさせるのを無効にし、homeからリダイレクトさせるための記述である。
# This file is made by RewriteRule Tool. # Enable RewriteEngine. RewriteEngine On # 404 Error for Multidomain Directories. RewriteCond %{HTTP_HOST} ^example.com$ RewriteCond %{REQUEST_URI} ^/(sub1.example.com|sub2.example.com)/ RewriteRule ^(.*)$ /$1 [L,R=404] # Main RewriteRule for multidomain. RewriteCond %{HTTP_HOST} ^(sub1.example.com|sub2.example.com) RewriteCond %{REQUEST_URI} !^/(sub1.example.com|sub2.example.com)/ RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/ [L]
次にサブドメインと同じ名前のディレクトリをhome直下に作成し、そこにコンテンツを格納する。
/home/ ←example.comのコンテンツ
/home/sub1.example.com/ ←sub1.example.comのコンテンツ
/home/sub2.example.com/ ←sub2.example.comのコンテンツ
通常はこれで問題ないはずだが、サブドメインにWordPressを設置した場合、パーマリンク設定を変更すると、そちらでもmod_rewriteの.htaccessが自動生成される。
# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
パーマリンク設定がデフォルト(http://sub1.example.com/?p=123)のままならよいが、変更してドメイン名以下にスラッシュが入るようになると(http://sub1.example.com/archives/123)、個別記事やアーカイブリストのURLが404エラーになってしまう。
原因はhome直下の.htaccessで一度mod_rewriteしているため、WordPressが生成した.htaccessが無視されるからだ。WordPressはindex.phpでページを動的生成するので、これを希望どおり挙動させるためには、home直下の.htaccessでindex.phpにリダイレクトすればよい(14行目末尾)。
# This file is made by RewriteRule Tool. # Enable RewriteEngine. RewriteEngine On # 404 Error for Multidomain Directories. RewriteCond %{HTTP_HOST} ^example.com$ RewriteCond %{REQUEST_URI} ^/(sub1.example.com|sub2.example.com)/ RewriteRule ^(.*)$ /$1 [L,R=404] # Main RewriteRule for multidomain. RewriteCond %{HTTP_HOST} ^(sub1.example.com|sub2.example.com) RewriteCond %{REQUEST_URI} !^/(sub1.example.com|sub2.example.com)/ RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/index.php [L]
これでパーマリンク設定を変えても動く。なお、WordPressの.htaccessも消してはいけない。消すとやはり個別記事やアーカイブリストのURLが404エラーになってしまう。これは残しておく必要がある。
「CakePHP Users in Japan」のフォーラムで、WebARENA SuiteXのマルチドメインにおける.htaccessの競合で困っている方はいたが、WordPressとの競合に関する記事は見当たらなかった。同じことでお困りの方のために記しておく。
(2012年12月17日追記)
親ドメインにもWordPressをインストールしていると、サブドメイン側が正しく挙動しない場合があることがわかった。
1件のコメント
Comments are closed.
貴重な情報ありがとうございました。WebARENAでうまく動くようになりました。
それはそれでとっても結構だったのですが…
ここで新たな問題が発生しました。ログインしたとか、誰がログインしているとかの情報がとれないのです。「ネットに書かれてないことを綴る」さんのところでは、例えば is_user_logged_in() の情報は正しく取得できてらっしゃいますか?気になって眠れません。私のところは何が悪いのか今だ不明です。
WebARENAさんへダメもとでご質問したら、サポート外なので判らないそうです。
WPもマルチドメインも、なかなか素人にはキビシイなと思いました。
私が運営しているサイトは閲覧のみで、ログイン情報については普段意識していませんが、is_user_logged_inタグを入れてみたところ、true/falseは正しく返しました。
マルチドメインということは、WordPressも複数サイト開設されているのではないかと思いますが、マルチサイト機能をお使いでしょうか。WordPressのマルチサイト機能もmod_rewriteモジュールを使うので、WebARENA SuiteXのマルチドメインとバッティングするといけないと思い、私はサブドメインごとに普通にインストールしています。
コメントありがとうございます。
そうですか問題ありませんか。なんだか希望がもてそうです。
私のサイトもドメイン毎に WordPress をインストールしております。
特に複雑なことをしているわけでもないので、どこかがオカシイのかな?と考えています。構成は親ドメインー子ドメイン4つ(内2つはWPサイトです)
RewriteRule設定は上から順番に
1)oya.jp/www.ko1.jp – 404 ※wwwなし親ドメイン名/www.子ドメイン名のアクセスは禁止
2)www.oya.jp/www.ko1.jp – 404 ※www.親ドメイン名/www.子ドメイン名のアクセスも同様に禁止
3)www.ko1.jp は index.php へ – WP利用サイト
4)www.ko2.jp は そのまま(WPでないサイト)
となっております。もしかしたら、親ドメイン名にwww.を付けた子ドメインがあるため話がややこしくなっているのかもしれません。もう少し構成をシンプルにしてテストをしてみます。
本当にありがとうございました。希望をもってやってみます。
いろいろ試してみました。
結果、やはりセッション管理がうまくできず、is_user_logged_in() は常に false しか返さないということが判明しました。
もしかして、「ネットに書かれていないことを綴る」さんのところでOKな理由は、
子ドメイン名=xxx.親ドメイン名 のDNSだからうまくいってるのでしょうか?
私のサイトは、親ドメイン名と子ドメイン名が全く異なるので、クッキーが
・ログイン/ログアウト = 親ドメイン名でセットされている
・投稿/ページ = 子ドメイン名でセットされている
という、ちくはぐな状態にあります。
今のところ解決策として考えられるのは
1)WebAREANA でマルチドメイン化しない運用をする
2)ドキュメントルート側に WordPress をインストールする
費用的には2)がお得そうですが、様々なことを鑑みると1)の方がより安心かも
しれないと考えています。
いずれにしても、もう少し WebARENA / WordPess を学習します。
このたびは、大変お世話になりました。
ありがとうございました。感謝!