|
perl实现域名跳转 |
|
用PERL制作简单的二级域名跳转程序
相信大家都申请过某些站点上提供的免费二级域名,例如网易的youname.yeah.net、youname.126.com等,这是用什么方法来实现的?现在我就用一个简单的二级域名跳转程序来为大家解开这一头雾水。首先让我们来看看下面的程序,下面的方法是通过默认首页来调用CGI程序达到判断分析并跳转,我们把一页面置于默认的首页(底下有介绍)当我们访问站点时例如:http://www.cpcw.com的时候,默认首页通过JAVASCIPT调用CGI程序,在程序里我们通过环境变量取得浏览器里输入的URL,对URL通过判断,得出是否二级域名,如果是二级域名就打开我们存储二级域名的文本,获取制定的URL,然后跳转。如果不是二级域名,就跳转到程序里设置的页面。这样,一个简单扼要的二级域名跳转程序就实现了。 ####程序开始#### $myurl="cpcw.com"; # 变量赋值 域名的后序 $head="/home/cpcw/"; # 变量赋值 纪录域名文档的目录路径 $urlfile="file.txt"; # 变量赋值 纪录域名文档文件名 $myhome= "http://www.cpcw.com/main.htm"; # 变量赋值 主页的真实URL @geturl = split(/&/, $ENV{'QUERY_STRING'});#使用split函数拆分脚本参数或者表单输入项,然后赋予@ocpurl foreach (@geturl) { ($name,$value) = split(/=/, $_); &setfrom($name, $value); }#循环拆分数组@geturl把其中的值分别赋予变量name和value并调用子程序setfrom对变量加以处理 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach (@pairs) { ($name, $value) = split(/=/, $_); &setfrom($name, $value); }#读取用POST递交的表单, 标准输入口的字节数,循环拆分字节赋予变量name和value并调用子程序setfrom对变量加以处理 $url =&getvar('url' ,'n|‖'); $id =&getvar('id' ,'n|‖'); $url ="$myurl" if (!($url =~ /.*:.*..*/ ));#从递交的表单里提取相对应的值赋予变量 $userip=$ENV{'REMOTE_ADDR'};#提取递交脚本的主机IP地址赋予变量 $url=~s/Http:////g; $url=~s/HTtp:////g; $url=~s/HTTp:////g; $url=~s/HTTP:////g; $url=~s/http:////g; $url=~s/hTTP:////g; $url=~s/htTP:////g; $url=~s/httP:////g; $url=~s/hTtP:////g; $url=~s/HtTp:////g; $url=~s/HttP:////g; $url=~s/hTTp:////g; $url=~s/HTtP:////g; $url=~s/htTp:////g; $url=~s/HtTP:////g; $url=~s/hTtp:////g; #把所有可能输入的http://方式都替换成空 if (/$url/i != ~$myurl){ &error("域名不正确"); exit 0; } @name1=split(/./,$url); $name2=$name1[0]; $name2=~tr/A-Z/a-z/; #对从浏览器输入的$url变量做一些处理 open (FILE,"$head$urlfile"); @line=<FILE>; close (FILE); #打开我们存储数据的文件并作赋值给@line foreach (@line){ @line1=split(/|/,$_); if ($line1[0] eq $name2){ $urllink=$line1[1]; } } if ($url =~/^$myurl/i){ $urllink=$myhome; } if(!($urllink)){ printf "无该域名"; exit 0; } print "Location: $urllinknn"; exit 0; sub setfrom {#对变量$name和$value做一些处理和过滤 $name=$_[0]; $value=$_[1]; $name=&de($name); $name=&filter($name); $value=&de($value); $value=&filter($value); if ($FORM{$_[0]}) {$FORM{$_[0]}="$FORM{$_[0]}§$_[1]";} else {$FORM{$_[0]}=$_[1];} } sub de{ local($return)=$_[0]; $return =~ tr/+/ /;#将加号转换成为空格 $return =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #将字符转换成指定格式,将十六进制值变成对应的字符。 $return =~ s/n/<br>/g;#把所有的n转换成<br> return $return; } sub filter{#对$return做过滤 local($return)=$_[0]; $return =~ s/<!--(.|n)*-->//g; if ($allow_html != 1) { $return =~ s/<([^>]|n)*>//g; $return =~ s/<//g; } return $return; } sub getvar {#从表单里取值的子程序 local($return)=""; $return="$FORM{$_[0]}" if ($FORM{$_[0]}); $return=~ s/$_[1]//g; return $return; } 以上的程序还要配合一个HTML页面来实现,我们需要把这页面做为首页,他会通过Javascript代码自动连接 我们上面的程序,程序通过判断,分析是否是二级域名,如果是就打开我们的存储文件查找并做跳转。 <html> <head><script language="Javascript"> NonJava =document.URL; NON="">"; document.write('<meta HTTP-EQUIV="REFRESH" CONTENT="0;URL=http://www.cpcw.com/name.cgi?url='+NonJava+NON); </script> <title></title> </head> <body> </body> </html> 域名资料存储文件格式如下 www|http://www.cpcw.com| bbs|http://www.cpcw.com/bbs/| ......... 技巧总结:通常我们看到我们申请的二级域名有这么一选项(隐藏地址栏、不隐藏地址栏)我们以上的程序只是跳转,并无实现真实的二级域名,我们可以通过HTML页面里的一些小技巧来实现,我们需要做一个模板页。程序通过调用这模板页实现让大家看到的状态栏还是例如:HTTP://BBS.CPCW.COM,模板页做成框架的形式,上面设置为一针,下面显示你所跳转的页面,这样你不管如何点击链接,浏览器上面的URL就怎么也不会变化!通过这种办法可以实现让人看起来是真的虚拟二级域名。 |