如何实现博客中的二级域名
我说自己做过博客,面试官就总问我博客中的二级域名实现的问题。这个看似与我编程无关的问题,总翻出来,烦死了。今天有时间,我要解决一下。
首先查到了与此相关的技术:泛域名。
泛域名是以*号为主机名的域名,如果做了泛域名解析,并且生效了,那域名前面不管写什么,只要后面是你的域名,那都可以访问到你的网站上去. 就像“*.icech.com”。那么泛域名有什么功用呢?这么说吧,你在DNS 中建立一个名为“*.icech.com”的泛域名,那么所有就像www.icech.com、news.icech.com、love.icech.com 等等格式的域名都不用建立就会自动生效,他们都会指向建立此泛域名时指向的IP 地址。如果你申请了一个域名,通过这样的测试,你就会知道你申请的域名是不是泛域名了。
建立泛域名的大致步骤是:
1、进入DNS,选“正向查找区域”,单击右键,新建“区域”,输入icech.com
2、选中“icech.com”,单击右键,新建“域”,输入“*”
3、选中“*”,新建“主机”,主机名保持为空,输入相应的IP 地址就OK了。
利用程序来完成虚拟域名的解析
假设我们希望设置一个news.icech.com 的域名,当我们在浏览器中输入“news.icech.com”的域名时,他会转向它的真实地址htttp://www.weste.net/index.htm。一般流程肯定就是,它会首先找到DNS 服务器,并且进行域名与IP 地址的转换,这里因为我们已经设置了泛域名,news.icech.com 就会直接指向icech.com 指向的IP,这之间我们不能做什么其他的设置来改变这一流程。那么我们所要做的就是在这个IP 地址所对应主机的默认WEB页面上做文章,让不同的子域名进行URL重定向,转到它们所希望的URL 网址上去。
1、设置icech.com所在主机所默认的WEB服务的默认文档为index.asp、index.php 或者index.cgi等动态页面,而不能是静态的index.htm 页面。
2、通过ASP、PHP或者CGI程序来进行URL的重定向功能
(1)index.php
$domain=$SERVER_NAME; //取得用户所访问的域名全称
$domain=eregi_replace('.icech.com', '', $domain); //截取域名全称,获取用户所要访问的三级域名,获取所访问的域名全称,可以直接使用PHP系统变量$SERVER_NAME 或 者$HTTP_HOST,注意引用系统内部变量必须大写。事实上PHP 系统内部已经对用户浏览器发送的访问请求头信息进行了全面的分析,并分割成、保存成相应的系统变量,以方便程序使用。第二个语句使用正则替换,查找“.icech.com”并替换成空字符,这样就获得了三级域名。
通常,一个大型的虚拟域名服务都是将用户子域名和其对应URL放在数据库里,这样, 用户可以随时注册新的三级域名和更改域名对应的URL,那么下面的工作就是从数据库中检索出该三级域名对应的URL(数据库检索程序略)。
...... //根据三级域名检索数据库,并得到变量$url,其中存放了该域名对应的URL 地址Header("Location: $url"); //系统重定向,使用户浏览器转向相应URL获得了对应URL 地址之后,我们可以使用PHP的header函数给用户浏览器发送一个重定向信息,让用户转移到相应的URL地址,这样一个完整的虚拟域名服务过程就结束了。
这里我们需要注意的是header函数之前,不能对浏览器有任何输出,否则会产生错误,另外重定向操作中的URL地址应该表述完整,例如:
//根据三级域名检索数据库,并得到变量$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。
(2)index.asp
<% name=request.querystring("name") %> ‘这样来获取用户所访问的域名全称
trim(name) ‘用trim 函数来截取域名全称,获取用户所要访问的三级域名与数据库对比,如果与数据库所设置的虚拟域名相同,则直接用response.redirect 转向
还有两种方法可以做到解析无限个二级域名
使用程序进行判断调整
iis服务的主机头留空,新建Default.asp文件,并把新建文件的执行优先级设定为最高(IIS设置属性中的文档,将Default.asp移到最上面)。
Default.asp文件代码:
<%
Dim iURL
iURL = Split(Request.ServerVariables("SERVER_NAME"),".")
If Lcase(iURL(0))="www" Then
'此处为网站首页地址,请自行选择
Response.Redirect("index.asp")
Else
'如二级域名所调转地址,请自行更改此处地址
Response.Write( "<frameset><frame src=""**.asp?"&iURL(0)&".index.html""></frameset>")
End If
%>
使用 ISAPI_Rewrite URL处理引擎
先介绍一下ISAPI_Rewrite :
ISAPI_Rewrite是一个强大的基于正则表达式的URL处理引擎。它非常类似于Apache's mod_Rewrite,但它是专为IIS设计的。
ISAPI_Rewrite有两个版本:ISAPI_Rewrite Full与ISAPI_Rewrite Lite。
ISAPI_Rewrite Lite是免费版本,但不支持反向代理功能。
ISAPI_Rewrite Full只能下载到30天的试用版本。
解析二级域名就可以用ISAPI_Rewrite一个规则来实现。