如何开发一个虚拟域名系统


Posted in PHP onOctober 09, 2006

大家在使用诸如yourname.yeah.net这样的简记域名时都感到十分方便,有很多人在想:我要是能让自己的服务器也能够实现简记域名就好了。其实这并不复杂。看完了本文,你也可以做一个简记域名系统。  

简记域名系统的关键技术在于:实现Web页面的重定向(Redirctory)。在本质上,简记域名系统和虚拟机系统完全不同。虚拟机的虚拟域名和IP是存在一一对应关系的。而简记域名系统不需要将域名和IP做一一映射。也就是说,它根本不需要复杂的域名解析机制和虚拟机来完成,它所做的事情就是当你在请求yourname.somedomain时,将你的浏览器重新定向到你本来存放Html页面的地方。  

为了说明的更完善,下面图例:  

我提供的源程序是运行环境是:RedHat 5.1 Linux下的Apache1.3.6 Web服务器+PHP3语言。 在编写程序之前,我们首先要设置好我们的服务器。首先要让Apache服务器支持php3。到ftp.redhat.com下载mod_php-2.0.1-9.i386.rpm,安装后,修改/etc/httpd/conf/http.conf文件,去掉#LoadModule php3_module一句前面的#注释号,同样在/etc/httpd/conf/srm.conf文件里去掉#AddType application/x-httpd-php3 .php3前面的注释号,同时在DirectoryIndex一项后添加index.php3。重新启动Apache Server,此时服务器就支持标准的php3语言脚本文件了并能将index.php3作为默认的首页。  

设置DNS服务器,使其能对泛域名解析。一般的Unix和Linux系统的DNS解析都是由Bind守护程序完成的,Bind4和Bind8的配置文件分别/etc/named.boot和name.conf,配置时根据你的系统修改。设置Bind的配置文件/etc/named.boot,在其中加入“primary domain.com db.domain”一句,添加一个新的域记录。在/etc/name.conf中加入:  

zone "domain.com" {  

type master;  

file "db.domain”;  

};  

在/var/name/中新建主域记录文件db.domain,其格式为:  

N SOA dns.domain.com root.domain.com (  

199811291 ;Serial  

28800 ;refresh  

7200 ;retry  

604800 ;expire  

86400) ;minimum  

dns  

MX 10 dns.domain.com.  

dns A 202.115.135.50  

www A 202.115.135.50  

* A 202.115.135.50  

关键是最后一句,即将整个域可能出现未做标记的所有Hostname全部指向同一IP。 执行/usr/sbin/ndc reload,重新加载域名数据库。测试一下,此时应该随便ping一个domain域内的主机(除已经标记的),都指向了指定的IP,那么DNS服务器设置完成。  

最后一步是编制PHP3脚本。我们刚才已经在图中详细的说明了整个的原理,所以写一个重新定向的程序就不是很难了。  

让我们来看一个由IE5.0送出的完整HTTP头信息:  

Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint,

 image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*  

Accept-Encoding: gzip, deflate  

Accept-Language: zh-cn  

Connection: Keep-Alive  

Host:ww.yahoo.com  

User-Agent: Mozilla/4.0 (compatible; MSIE 5.0b1; Windows 98)  

我们需要在整个HTTP头信息中取出Host信息,然后将http://www.jj.jx.cn/www.xxx.xxx/default.htm形式的第一部分“www”,即HostName(也即是用户注册的name)单独取出,作为重定向检索的关键字。  

检索到用户注册的URL信息后,我们给用户浏览器送一个重定向命令“Localtion: http://www.jj.jx.cn/somewhere/sample.html”,将用户重定向到指定页面。  

在PHP3中,有函数GetAllHeader(),取得浏览器送出的HTTP头信息。我们主要需要使用此函数来完成整个程序。  

后面附有源程序,由于只是实验性质的,所以在查询用户信息时,没有使用数据库,如果整个系统要实际应用的话,一定要和数据库挂接起来,不然查询用户信息的过程将是十分漫长,大大影响效率,而且用户数据的管理也不方便。(由于篇幅限制,没有给出注册和管理所需的写记录程序,请自行添加)  

在源程序中,所有用户信息记录在data子目录下user.dat文件中。其格式为:  

username:  

http://octopus.cdit.edu.cn/~qap213/index.html  

附PHP3源程序:  

<?  

//Get HTTP's Header and parse it//  

$headers = getallheaders();  

while (list($header, $value) = each($headers)) {  

if($header=="Host"){$username= strtok($value,".");}}  

//Jump out the Banner's Window//  

echo '<script language="JavaScript">',  

'msg=window.open("banner.htm","sample",  

"toolbar=no","directories=no",directories=no","menubar=no");',  

'</script>';  

   

// seek the user information from the recorded file//  

if(!$usrinfo=file("data/user.dat")){echo "Open Data File Error!!";}  

$url="http://";  

for($i=0;$i<count($usrinfo);$i++)  

if(strtok($usrinfo[$i],":")==$username){  

$url=$usrinfo[$i+1];  

}  

if($url=="http://"){echo "not found the uesrname of Data!";}  

else{  

echo '<meta http-equiv="refresh" content="0;','url=',$url,'">';}  

?>  

PHP 相关文章推荐
PHP实现的功能是显示8条基色色带
Oct 09 PHP
php对gzip文件或者字符串解压实例参考
Jul 25 PHP
php 全局变量范围分析
Aug 07 PHP
PHP之COOKIE支持详解
Sep 20 PHP
wamp安装后自定义配置的方法
Aug 23 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
PHP获取用户客户端真实IP的解决方案
Oct 10 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
PHP环形链表实现方法示例
Sep 15 PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 PHP
Laravel框架路由管理简单示例
May 07 PHP
PHP实现两种排课方式
Jun 26 PHP
PHP中对数据库操作的封装
Oct 09 #PHP
用DBSQL类加快开发MySQL数据库程序的速度
Oct 09 #PHP
一个简洁的多级别论坛
Oct 09 #PHP
用ODBC的分页显示
Oct 09 #PHP
为查询结果建立向后/向前按钮
Oct 09 #PHP
投票管理程序
Oct 09 #PHP
用PHP和ACCESS写聊天室(九)
Oct 09 #PHP
You might like
php写的简易聊天室代码
2011/06/04 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
PHP json格式和js json格式 js跨域调用实现代码
2012/09/08 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
php使用fputcsv()函数csv文件读写数据的方法
2015/01/06 PHP
php检查页面是否被百度收录
2015/10/28 PHP
js 模拟气泡屏保效果代码
2010/07/10 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
vue.js todolist实现代码
2017/10/29 Javascript
vue与vue-i18n结合实现后台数据的多语言切换方法
2018/03/08 Javascript
Vue 动态设置路由参数的案例分析
2018/04/24 Javascript
通过微信公众平台获取公众号文章的方法示例
2019/12/25 Javascript
python实现将pvr格式转换成pvr.ccz的方法
2015/04/28 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
pandas数据清洗,排序,索引设置,数据选取方法
2018/05/18 Python
Python版名片管理系统
2018/11/30 Python
python redis 删除key脚本的实例
2019/02/19 Python
Python3解释器知识点总结
2019/02/19 Python
简单了解python的内存管理机制
2019/07/08 Python
解析python实现Lasso回归
2019/09/11 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
使用python求解二次规划的问题
2020/02/29 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python中关于数据类型的学习笔记
2020/07/19 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
StubHub西班牙:购买和出售全球活动门票
2017/06/05 全球购物
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
手机促销活动方案
2014/02/05 职场文书
班级安全教育实施方案
2014/02/23 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
node快速搭建后台的实现步骤
2022/02/18 NodeJs