多个WordPress共享一个虚拟主机的探讨
这个问题已经有一些WPer研究过,你可以先看看CBM的文章《面向对象(oop)的使用Wordpress系统 一拖N的用法》。
最笨的办法是在虚拟主机根目录下建立多个WP的子目录,每个WP使用不同的表前缀。做好每个域名的解析后,这个时候有两个比较好的方案使你的两个WP都表现成顶级域名访问。
一个方案是使用.htaccess。在根目录下建立.htaccess文件,示例如下:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?wpzt\.net$
RewriteCond %{REQUEST_URI} !^/wpzt/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wpzt/$1
RewriteCond %{HTTP_HOST} ^(www\.)?wpzt\.net$
RewriteRule ^(/)?$ wpzt/index\.php [L]
RewriteCond %{HTTP_HOST} ^(www\.)?s-kills\.cn$
RewriteCond %{REQUEST_URI} !^/skills/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /skills/$1
RewriteCond %{HTTP_HOST} ^(www\.)?s-kills\.cn$
RewriteRule ^(/)?$ skills/index\.php [L]
RewriteCond %{HTTP_HOST} ^(www\.)?tothink\.net$
RewriteCond %{REQUEST_URI} !^/tothink/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /tothink/$1
RewriteCond %{HTTP_HOST} ^(www\.)?tothink\.net$
RewriteRule ^(/)?$ tothink/index\.php [L]
以上示例是wpzt.net,s-kills.cn,tothink.net三个域名分别指向对应文件夹的WordPress。这个方法需要服务器支持Rewrite,Rewrite语法掌握起来不易,如果WP装了一些需要Rewrite支持的插件,可能会出现问题。
另一个方案是应用强大的php来解决。在根目录下建立index.php文件,源代码示例如下:
<?
function get_domain($host){
$arr=explode(“.”,$host);
$p=count($arr);
$domain=$arr[$p-2].”.”.$arr[$p-1];
return $domain;
}
$domain=get_domain($_SERVER['HTTP_HOST']);
include($domain.”.php”);
?>
我同时在根目录下建立wpzt.net.php,s-kills.cn.php,tothink.net.php。wpzt.net.php文件的代码如下:
<?php
define(‘WP_USE_THEMES’, true);
include(‘./wpzt/wp-blog-header.php’);
?>
其他两个文件的内容也是类似,include语句的参数不同而已。这个技巧可以查看《多个域名共享一个虚拟主机的PHP源码》。运用php语言当然还可以实现更完美的功能,可以见《PHP源码:单主机+多域名+泛域名+多级域名》。
恰如CBM的文章所述,以上方法复用性太低。因此,按照他的思路,我最终把三个WP合并到同一个目录中去了,在wp-config.php中的相关代码段摘录如下:
function get_domain($host){
$arr=explode(“.”,$host);
$p=count($arr);
$domain=$arr[$p-2].”.”.$arr[$p-1];
return $domain;
}
$domain=get_domain($_SERVER['HTTP_HOST']);
if ($domain == “wpzt.net”){
$table_prefix = ‘wpzt_’;
}
elseif ($domain == “s-kills.cn”){
$table_prefix = ’skills_’;
}
elseif ($domain == “tothink.net”){
$table_prefix = ‘tothink_’;
}
这个方法确实很方便于同时管理三个WP,不过,一些插件的运用可能会出现问题。比如wp super cache这个插件在全开时就出现了错误。