首页 » 系统运维 » Linux服务器 » 正文

利用.htaccess将一个虚拟主机绑定多个独立网站

虚拟主机可以绑定很多域名,但是打开后是同一个网站,如何让一个虚拟主机绑定不同的域名,并且打开域名后访问的是不同的网站,只要你的主机开启了rewrite重写模块,支持.htaccess的话,就可以做到,这样对于一些要求不高的网站可以节省网站成本。

比如我们要实现以下的域名绑定,虚拟主机里分别有三个目录:site1、site2、site3

site1目录:绑定域名site1.com和www.site1.com

site2目录:绑定域名site2.com和www.site2.com

site3目录:绑定域名site3.com和www.site3.com

方法如下:

第一步,先把所有的域名和虚拟主机互相绑定解析。

第二步,在虚拟主机网站根目录下放置一个.htaccess文件,内容如下:

RewriteEngine On
RewriteBase /
DirectoryIndex index.php index.html index.htm
RewriteCond %{HTTP_HOST} ^(www\.)?site1\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/site1/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ site1/$1
RewriteCond %{HTTP_HOST} ^www.site1.com$
RewriteRule ^(/)?$ site1/index.php [L]

上面的代码的作用是把www.site1.com这个域名绑定到了虚拟主机里site1这个目录,相当于site1就是一个独立域名主机服务器。但是如果只到这里,你会发现,当你通过www.site.com/site1/的方式也可以访问www.site1.com里面的内容,这当然是我们不想看到的,也不利于seo。如果禁止其他域名访问www.site1.com中的内容呢?接下来需要继续操作:

第三步,在site1目录下放置一个.htaccess文件,内容如下:

RewriteEngine On
# 禁止通过非本网站域名访问
RewriteCond %{HTTP_HOST} !^(www.)?site1.com$ [NC]
RewriteRule ^.*$ [L,r=404]

通过以上两步,已经成功的实现了域名www.site1.com绑定site1子目录,如果继续增加www.site2.com、www.site3.com等站点的话,和上面的方法一样。

保哥亲测可用!这个方法对于一些空间商后台不支持子目录绑定功能的虚拟主机,可使用此方法破解!

以上.htaccess文件里代码的作用

【RewriteEngine On】
表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

【RewriteCond %{HTTP_HOST} ^(www\.)?site1\.com$ [NC]】
表示重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.site1.com不包括“http://”和“/”,^表 示字符串开始,$表示字符串结尾,\.表示转义的. ,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www\.出现0次或1次,这句规则的意思就是如果访问的网址是site1.com或者 www.site1.com就执行以下的语句,不符合就跳过。还有,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。

【RewriteCond %{REQUEST_URI} !^/blog/】
也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的地址不以/blog/开头,只是开头^,没有结尾$

【RewriteCond %{REQUEST_FILENAME} !-f】
【RewriteCond %{REQUEST_FILENAME} !-d】
这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径

【RewriteRule ^(.*)$ blog/$1】
表示重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面 /site1/$1是重写成分,意思是将前面匹配的字符重写成/site1/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* 。

 

发表评论