如何使用阿里云虚拟主机建立多个网站

之前在阿里云上买了一个虚拟主机,用来做学习研究之用。最近准备搭建一个其他的项目,也想放到这个服务器上在线浏览,最终想实现的效果就是多个域名指向同一台虚拟机,访问不同的目录,展现出对应网站的效果。
但是阿里云虚拟主机只能放一个网站,为了能够搭建多个网站就要使用到伪静态文件.htaccess 文件,中间遇到不少坑,这里记录一下。
新域名的申请、购买、备案、解析、绑定这一系列的前期工作我篇文章就不做过多叙述了,按照常规流程配置即可。

本篇教程最终要达到的效果是在一个虚拟主机上搭建两个网站,搜索不同的域名,可以访问到对应网站的效果。

假设我们有两个域名,www.aaa.com 和 www.bbb.cn,它们在阿里云虚拟主机对应的目录分别是 a 和 b 文件夹,那么通过以下操作可以实现阿里云虚拟主机建立两个网站(理论上可以建立很多个)。
1、创建文件夹及.htaccess记事本
在空间根目录下,新建一个 a 目录、b 目录、和一个.htaccess文件,我是直接在windows上建好以后上传上去的,目的是要将www.youzifen.com绑定到 a 目录、www.xiaozhugou.cn绑定到 b 目录。

2、文件内容展示
(1)根目录下.htaccess文件内容如下:

# 二级域名绑定子目录

RewriteEngine on

RewriteBase /

# 锦衣卫影视

RewriteCond %{HTTP_HOST} ^www.aaa.com$

RewriteCond %{REQUEST_URI} !^/a/

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /a/$1

RewriteCond %{HTTP_HOST} ^www.aaa.com$

RewriteRule ^(/)?$ /a/index.php [L]

# 小猪购--一家专门为你省钱的网站

RewriteCond %{HTTP_HOST} ^www.xiaozhugou.cn$

RewriteCond %{REQUEST_URI} !^/b/

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /b/$1

RewriteCond %{HTTP_HOST} ^www.xiaozhugou.cn$

RewriteRule ^(/)?$ /b/index.php [L]

(2)在 a 文件夹内建立一个.htaccess 文件,内容如下:

# 子目录中只允许绑定的域名访问

RewriteEngine on

RewriteBase /a

RewriteCond %{HTTP_HOST} !^www.youzifen.com$ [NC]

RewriteRule ^(.*)$ http://www.youzifen.com/$1 [L,R=301]

(3)在 b 文件夹内建立一个.htaccess 文件,内容如下:

# 子目录中只允许绑定的域名访问
RewriteEngine on

RewriteBase /b

RewriteCond %{HTTP_HOST} !^www.bbb.cn$ [NC]

RewriteRule ^(.*)$ http://www.bbb.cn/$1 [L,R=301]

3、文件内容解释
【RewriteEngine on】
表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。
【RewriteCond %{HTTP_HOST} ^www.youzifen.com$】
这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.youzifen.com不包括“http://”和“/”;
^表示 字符串开始,$表示字符串结尾,.表示转义的,如果不转义也行,推荐转义,防止有些服务器不支持,这句规则的意思就是如果访问的网址是www.youzifen.com就执行以下的语句,不符合就跳过。

【RewriteCond %{REQUEST_URI} !^/a/】
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/a/开头,只是开头^,没有结尾$
【RewriteCond %{REQUEST_FILENAME} !-f】【RewriteCond %{REQUEST_FILENAME} !-d】
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径
【RewriteRule ^(.*)$ /a/$1】

重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则。

^(.*)$是一个正则表达的匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N0),后面 /a/$1是重写成分,意思是将前面匹配的字符重写成/a/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,其实这儿将会出现一个问题,后面讨论。

【RewriteCond %{HTTP_HOST} ^www.youzifen.com$】

【RewriteRule ^(/)?$ /a/index.php[L]】

这两句的意思是指,请求的host地址是www.youzifen.com时,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页。/index.php非常关键,如果不写,当你访问http://www.youzifen.com时,会自动变成http://www.youzifen.com/a,一直带着子目录的名字。一开始我没写,为了去掉后面这个a折腾了好久。

[NC]:不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。

4、上传建站程序

此时,我们可以分别在 a 和 b 文件夹上传相应的建站程序,然后就可以通过不同的域名访问不同的文件夹内容,这就实现了一个阿里云虚拟主机建立多个网站。

【注】:因为我使用的 B 网站源码不支持在子文件夹中运行,所以在这个问题上面也困扰了很长时间,后来的解决方案是:
既然阿里云虚拟机提供一个网站文件夹,也就是根目录里面可以放一个 B 网站,那么要想多放一个 A 网站,只需要建立一个文件夹,名字随便起,我这里叫 a 也就是 A 网站的根目录。
将B网站的源码直接上传到网站根目录;A网站的源码重新命名 a 文件夹上传。当然对应的.htaccess 文件也需要做一点小修改。

最终,两个网站完美运行。