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


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 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
使用sockets:从新闻组中获取文章(一)
Oct 09 PHP
PHP字符串中特殊符号的过滤方法介绍
Feb 18 PHP
destoon各类调用汇总
Jun 20 PHP
PHP页面实现定时跳转的方法
Oct 31 PHP
PHP自定义函数格式化json数据示例
Sep 14 PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
May 25 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
PHP如何开启Opcache功能提升程序处理效率
Apr 27 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中使用模板的方法
2008/05/24 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
利用jquery写的左右轮播图特效
2014/02/12 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
JavaScript学习心得之概述
2015/01/20 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
2017/09/11 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
JS正则表达式常见函数与用法小结
2020/04/13 Javascript
[01:00:12]2018DOTA2亚洲邀请赛 4.7 淘汰赛 VP vs LGD 第一场
2018/04/09 DOTA
在主机商的共享服务器上部署Django站点的方法
2015/07/22 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
详解python的数字类型变量与其方法
2016/11/20 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
不知道这5种下划线的含义,你就不算真的会Python!
2018/10/09 Python
解决python3 Pycharm上连接数据库时报错的问题
2018/12/03 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
django自带调试服务器的使用详解
2019/08/29 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
基于Python的OCR实现示例
2020/04/03 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
HTML5实现多张图片上传功能
2016/03/11 HTML / CSS
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
巴西最大的玩具连锁店:Ri Happy
2020/06/17 全球购物
庆国庆国旗下讲话稿2014
2014/09/21 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
财务稽核岗位职责
2015/04/13 职场文书
老乡聚会通知
2015/04/23 职场文书