PHP程序:虚拟域名服务DIY
虚拟域名是什么?
虚拟域名服务是伴随着免费个人主页空间的出现而开始流传的。中国的个人主页服务始于1996年初,随后便出现了湛江“碧海银沙”、网易个人主页基地等许多较大规模的个人主页空间服务,个人主页曾一度盛行,为中国因特网的普及和发展做了很重要的铺垫。
我们知道,常见的域名有。com、。net等多种,类似5945.net的域名,我们就称为*域名,也是需要付费的域名,而诸如abc.5945.net形式的域名,我们就常称为三级域名,可以由用户本身定义,无需付费。所谓的虚拟域名通常是在三级域名或多级域名上做文章,虚拟域名服务的任务就是将简单而容易记忆的三级或多级域名重定向到一个相对复杂而不易记忆的URL地址,该服务的意义也即在于此。
泛域名是什么?
熟悉NT的虾米都知道,如果要在NT上设置三级、多级域名,首先需要设置DNS服务器,让形如abc.5945.net的域名能够解析到我们指定的主机IP地址上,然后我们需要设置该主机的IIS(Internet Information Server),让该三级域名能访问对应URL地址。由此可见这个过程并不复杂,然而需要对各台主机有相应的配置权限,显然这是不可能的;同时,提供大量而密集的服务时,设置过程显得缓慢而烦琐。那么真正的虚拟域名服务是怎样实现的呢?答案很简单:使用泛域名。
泛域名类似于DOS下的通配符,比如你在DNS中建立一个名为*.5945.com的泛域名,则所有如www.5945.net、abc.5945.net、ftp.abc.5945.net等形式的域名都不用在DNS中另行设置而“自动生效”,它们在被DNS解析时均会指向建立此泛域名时所指定的同一个IP地址。这样,我们只需要为我们的主域名申请一个泛域名解析服务,域名解析问题就迎刃而解了,而且被解析到同一个IP地址,那么我们所要做的就是在这个IP地址所对应主机的默认WEB页面上做文章,让不同的子域名进行URL重定向,转到它们所希望的URL网址上去。这里需要说明的是,每台提供WEB服务的主机都有一个默认的WEB服务,如果一个域名被解析到该主机,而在WEB服务器软件中没有设置其对应文档目录时,对该网址的请求即被提交给默认WEB服务,这是我们虚拟域名服务的基本流程,同时也说明,一台主机只能提供一个虚拟主机服务。
例程解析:
我们以PHP程序为例来介绍这个过程。
假设我们需要提供域名为5945.net的虚拟域名服务,5945.net主机所默认的WEB服务的默认文档为index.php(默认文档页面名可以由WEB Server设置),那么该页面程序就应负责将abc.5945.net重定向到我的免费空间,比如:www.netease.com/~abc/default.htm。那么,我们的程序首先需要分析用户所访问的三级域名是什么。
index.php:
$domain=$SERVER_NAME; //取得用户所访问的域名全称
$domain=eregi_replace('.5945.net', ', $domain); //截取域名全称,获取用户所要访问的三级域名,获取所访问的域名全称,可以直接使用PHP系统变量$SERVER_NAME或者$HTTP_HOST,注意引用系统内部变量必须大写。事实上PHP系统内部已经对用户浏览器发送的访问请求头信息进行了全面的分析,并分割成、保存成相应的系统变量,以方便程序使用。第二个语句使用正则替换,查找“.5945.net”并替换成空字符,这样就获得了三级域名。
通常,一个大型的虚拟域名服务都是将用户子域名和其对应URL放在数据库里,这样,用户可以随时注册新的三级域名和更改域名对应的URL,那么下面的工作就是从数据库中检索出该三级域名对应的URL(数据库检索程序略)。
…… //根据三级域名检索数据库,并得到变量$url,其中存放了该域名对应的URL地址
Header("Location: $url"); //系统重定向,使用户浏览器转向相应URL
获得了对应URL地址之后,我们可以使用PHP的header函数给用户浏览器发送一个重定向信息,让用户转移到相应的URL地址,这样一个完整的虚拟域名服务过程就结束了。这里我们需要注意的是header函数之前,不能对浏览器有任何输出,否则会产生错误,另外重定向操作中的URL地址应该表述完整,例如:http://www.netease.com/~abc/~index.htm。
广告窗口的弹出:
细心的读者肯定发现,常见的虚拟域名服务通常会有弹出广告窗口,是怎么实现的呢?为了能统一控制,必须在重定向用户浏览器之前弹出这个广告框,那么重定向操作就不能简单地使用header函数了,因为这个函数要求使用前不能对浏览器有任何输出。要实现它,我们必须改变方法:
…… //根据三级域名检索数据库,并得到变量$url,其中存放了该域名对应的URL地址
echo '<script language="javascript">window.open("adv.htm");</script>';
//输出一段javascript代码,用以打开一个广告窗口,显示广告页adv.htm
echo '<meta http-equiv="refresh" content="0;URL='.$url.'">';
//使用HTML的meta语句来实现系统重定向,让用户浏览器转向相应URL