「WebARENA SuiteXのマルチドメインでWordPressのパーマリンク設定を変える方法」で、次のようにサブドメインを設定し、それぞれのサブドメインにWordPressをインストールする場合の.htaccessについて説明した。
example.com
sub1.example.com ⇒WordPressをインストール
sub2.example.com ⇒WordPressをインストール
このとき、すでに親ドメインにWordPressをインストールしていると、サブドメインのWordPressの挙動が不正になることがある。親ドメインのルート直下に、WordPress用のmod_rewriteを記述した.htaccessが存在する場合だ。私は次の状況で経験した。
example.com ⇒WordPressをルート以外(/wpなど)にインストール
sub.example.com ⇒WordPressをルート以外(/wpなど)にインストール
親ドメイン・サブドメインとも、インストール先は専用ディレクトリ「wp」だが、「WordPress Codex 日本語版」に従い、ルートディレトリでWordPressを表示させている。どちらもパーマリンク設定をしているので、.htaccessが存在する。ディレクトリをツリー表示すると下記のようになる。
home(.htaccess設置) ├wp(.htaccess設置)⇒親ドメインのWordPress │├wp-admin │├wp-content │└wp-includes └sub.example.com(.htaccess設置) └wp(.htaccess設置)⇒サブドメインのWordPress ├wp-admin ├wp-content └wp-includes
WebARENA SuiteXは、サブドメイン名と同じディレクトリをルート直下に作成し、そこにコンテンツを置くことになっている。親ドメインのWordpressで使用するmod_rewriteが、ドメインルート直下の.htaccessに記述されているため、サブドメインもその影響を受けてしまうのだ。データベースの内容自体は表示されるのだが、スタイルシートが適用されず、管理画面にログインしようとすると、親ドメインの管理画面にリダイレクトされてしまう。
AddHandler application/x-httpd-php53 .php # This file is made by RewriteRule Tool. # Enable RewriteEngine. RewriteEngine On # 404 Error for Multidomain Directories. RewriteCond %{HTTP_HOST} ^example.com$ RewriteCond %{REQUEST_URI} ^/(sub.example.com)/ RewriteRule ^(.*)$ /$1 [L,R=404] # Main RewriteRule for multidomain. RewriteCond %{HTTP_HOST} ^(sub.example.com) RewriteCond %{REQUEST_URI} !^/(sub.example.com)/ RewriteRule ^(.*)$ /%{HTTP_HOST}/$1/index.php [L] # BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
18~28行目は親ドメインのWordPress用のmod_rewriteなので、これが親ドメインだけに適用されるよう、RewriteCondで除外出来ないか試みたが、
RewriteCond %{HTTP_HOST} !^(sub.example.com)
や
RewriteCond %{REQUEST_URI} !^(sub.example.com)
をRewriteRuleの前に追加しても効果がない。
こうなったら最後の手段だ。データベースの内容自体は表示しているので、「wp-admin」「wp-content」「wp-includes」の各ディレクトリにパスが通っていないと考え、親ドメインのWordPressと同様にhomeから1階層目になるよう、「wp」ディレクトリを廃止してみた。
home(.htaccess設置) ├wp(.htaccess設置)⇒親ドメインのWordPress │├wp-admin │├wp-content │└wp-includes └sub.example.com(.htaccess設置)⇒サブドメインのWordPress ├wp-admin ├wp-content └wp-includes
なんということでしょう、正常に表示されたではないか。
ディレクトリやフォルダを上の階層に移動する場合、FFFTPには専用メニューはないが、右クリックの[名前変更(N)]で対応出来る。*1 サブドメインのルート直下のindex.phpは、もちろん初期状態に戻す。
require('./wp-blog-header.php');
管理画面で設定したWordPressアドレス(インストール先URL)は「sub.example.com/wp」のままなので、これはphpMyAdminでデータベースを直接修正した。「(接頭辞)+options」のテーブルを開き、「siteurl」を編集すればよい。
サブドメインとはいえ、ルート直下にファイルをばらまくのは抵抗があったが、いまのところ、これしか回避手段がない。