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


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上传图片类(随机名,缩略图,加水印)
Jun 30 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
ajax返回值中有回车换行、空格的解决方法分享
Oct 24 PHP
个人写的PHP验证码生成类分享
Aug 21 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
Nov 18 PHP
php上传文件常见问题总结
Feb 03 PHP
用php代码限制国内IP访问我们网站
Sep 26 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
Ajax请求PHP后台接口返回信息的实例代码
Aug 21 PHP
stripos函数知识点实例分享
Feb 11 PHP
mongodb和php的用法详解
Mar 25 PHP
PHP引擎php.ini参数优化深入讲解
Mar 24 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获取指定时间段之间的 年,月,天,时,分,秒
2016/06/05 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
如何用js控制frame的隐藏或显示的解决办法
2013/03/20 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
黑帽seo劫持程序,js劫持搜索引擎代码
2015/09/15 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
Web开发使用Angular实现用户密码强度判别的方法
2017/09/27 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
详解js跨域请求的两种方式,支持post请求
2018/05/05 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
layui的布局和表格的渲染以及动态生成表格的方法
2019/09/18 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
jquery实现点击左右按钮切换图片
2021/01/27 jQuery
Python基础入门之seed()方法的使用
2015/05/15 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python 多进程和数据传递的理解
2017/10/09 Python
tensorflow输出权重值和偏差的方法
2018/02/10 Python
Python实现按中文排序的方法示例
2018/04/25 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
详解Python是如何实现issubclass的
2019/07/24 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
CSS3的transition和animation的用法实例介绍
2014/08/20 HTML / CSS
PHP面试题-$message和$$message的区别
2015/12/08 面试题
大学生涯自我鉴定
2014/01/16 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
小学语文教师研修日志
2015/11/13 职场文书