深入探究URL转发中的秘密
URL转发,英文名称 URL Redirect ,很多个人用户都不约而同的选择了使用一个很简单的免费子域名来代替自己网站冗长的网络地址。
1、什么叫 URL 转发
其实,说起他,大家都不陌生。很多人都使用过,比如你申请了一个免费空间http://www.icpname.com/freeuser/yourusername,你如果认为访问起来十分不方便,就可以选择申请一个免费的域名转向,最常用的就是 username.126.com 的域名,通过在线提交表单,完成你的设置后,以后,只需要访问这个简单易记的地址,就可以转向到你的网页。
2、URL转发实现的条件
首先,我们如果想提供URL转发服务,就需要将需要转发的域名的DNS指向都指到提供转发服务的服务器上,或者,干脆对某个域名提供泛域名解析(既添加一条*记录)。使此域名的所有次级域名都指向到URL转发服务器。
3、URL转发实现的原理
假定我们的域名是 sunwise.net ,我们来分析下面的一段代码:
<%
‘先得到用户浏览器请求的网址
Server_Name = Request.ServerVariables("SERVER_NAME")
’循环得到子域名的用户名,既 user.sunwise.net 的 user 部分
For I=1 To Len(Server_Name)
If Mid(Server_Name,i,1)="." or Mid(Server_Name,i,1)="@" Then Exit For
If Mid(Server_Name,i,1)=";" or Mid(Server_Name,i,1)="," then
Response.Write("错误的请求字符串!")
Response.End
exit for
end if
USER = USER & Mid(Server_Name,i,1>
Next
‘打开数据库,查找 user 对应的实际地址
set conn =Server.CreateObject("ADODB.Connection")
conn.open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("dns.mdb">
Set rs = server.createobject("adodb.recordset")
sql="SELECT * FROM urlname WHERE username="&user&""
rs.open sql,conn,1,2
if rs.eof or rs.bof then
response.write "错误!没有找到地址!"
else
’在页面中进行跳转
URL=rs("url")
%>
<meta http-equiv="refresh" content="0;url=<%=URL%>">
<%End If
‘销毁对象
Set rs=Nothing
conn.close
Set conn=Nothing
%>这段代码实现的就是一个极为简单的url转发功能。代码中,我们先得到用户名,再查询数据库得到对应的实际地址,然后进行了跳转。
4、URL转发存在的弱点及改进方案。
URL转发也存在其先天的弱点,比如,当一个域名直接指向到服务器时,我们可以通过 http://sunwise.net/bbs/ 来访问其中的bbs目录。但是,当使用URL转发时,我们所请求的地址就不能被正确解释。这不得不说是URL转发的一个小小的遗憾。
不过,办法总是有的。下面,我就发表一下我自己的解决方案。
首先,所谓的URL转发,不过是一个ASP页面,那,如果我们把这个页面删除,会有什么后果呢?当网站中没有任何文件时,所有访问都将被指向到HTTP404的错误页面。
这个错误页面是可以自定义的,我们就可以在这个HTTP404错误页面上做一点小小的改动。
我们分析下面代码
<%
’=================================
‘ CopyRight 2003 盛中华
’ www.sunwise.net
‘ mailto:szh@sunwise.net
‘ OICQ:53123256
’ 哈尔滨工程大学03-613班
=================================
‘先对您的域名进行配制!!
’在此填写您的域名:
mydomain="sunwise.net"
‘得到用户浏览器请求的网址
strURL=Right(Request.QueryString,Len(Request.QueryString)-11))
’循环得到子域名的用户名,既 user.sunwise.net 的 user 部分
For I=1 To Len(strURL)
If Mid(strURL,i,1)="." or Mid(strURL,i,1)="@" Then Exit For
If Mid(strURL,i,1)=";" or Mid(strURL,i,1)="," then
Response.Write("错误的请求字符串!")
Response.End
exit for
end if
USER = USER & Mid(strURL,i,1>
Next
‘打开数据库,查找 user 对应的实际地址
set conn =Server.CreateObject("ADODB.Connection")
conn.open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("dns.mdb">
Set rs = server.createobject("adodb.recordset")
sql="SELECT * FROM urlname WHERE username="&user&""
rs.open sql,conn,1,2
if rs.eof or rs.bof then
response.write "错误!没有找到地址!"
else
’对数据进行整理,避免出现"//"的情况
URL=rs("url")
if right(URL,1)="/" then URL=left(URL,Len(URL)-1)
‘生成跳转地址
path=Replace(strURL,USER & "." & mydomain,URL)
’在页面中进行跳转
Response.Redirect(Path)
End If
‘销毁对象
Set rs=Nothing
conn.close
Set conn=Nothing
%>
此时删除所有该站点下的网页文件,当用户访问时,服务器就会发生HTTP404错误,将浏览器定向到此ASP文件,以实现高级的URL转发。
补充:综合编程 , 安全编程 ,