玩转虚拟域名◎+

 更新时间:2016年11月25日 17:34  点击:2396

玩转虚拟域名◎+ .

不知道大家最近上网是否发现一个新现象,就是有一些网站开始提供“username@server”的虚拟域名服务。由于“@”的魅力,大家纷纷申请,你或许会想:“假如我也能提供这种服务,该多好阿:)人气肯定不错!”本文将给大家揭开“@”的“神秘”面纱,让大家都可以来“@”!(Do u @ today?)
别急,这个并不是电子邮件的地址,是一种虚拟域名,不相信的话可以在浏览器中访问“bbs@zphp.com”。部分朋友应该使用过IE的FTP功能,就是在浏览器的地址栏中键入“password:username@server”IE就会自动登陆FTP服务器;而在Http1.1协议中,就规定了Http访问授权功能,形式同样为“password:username@server”,其中“password:”可以省略,也是是访问“bbs@zphp.com”实际上是以bbs的身份访问“zphp.com”这个服务器。
那么我们只是需要将具体的URI传送给PHP程序,在数据库中搜索出真实的URL重定向就可以了。
首先我们需要制作一个传送URI的页面(作为服务器的默认文档,一般命名为index.htm);在JS的Window对象中就可以实现这项功能,下面是index.htm的源代码:
<script>
this.location = ‘gotourl.php?url=’ this.location.href;
</script>
上面的代码会将浏览器重定向到gotourl.php,并且通过QueryString给变量$url赋值为当前的URI。
成功将URI传递给PHP程序后,就可以进入数据库查找真实URL,下面是SQL数据库相对应的table 的结构:
CREATE TABLE domain(
Id int(3) UNSIGNED DEFAULT ‘0’ NOT NULL, # 域名ID
Domain char(20) NOT NULL, # 域名
Gotourl char(255) NOT NULL, # 真实的URL
);
建立好了Table,就可以开始编写gotourl.php了,程序分为三个部分:

1、 分析URL:
$url = preg_replace(“/^http:///I”, “”, $url); // 将URL前面的“http://”去掉,不区分大小写
$url = preg_replace(“/@. $/”, “”, $url); // 将“@”后面的部分去除
那么,剩下的URL就只含有“username”的部分了。
为了给数据库应用,需要对铭感的字符进行处理:
$url = addslashes($url);
2、 搜索真实的URL:
这里为了实现程序的通用性,使用了一个数据库的操作类(修改自PHPLib)来操作SQL数据库:
$db = new dbSql(); // 连接数据库
$queryString = sprinf(“SELECT gotourl FROM domain WHERE domain=’%s’;”, $url); // 生成查询字符串
$gotourl = $db->result($queryString); // 查询取得结果
3、 重定向:
在PHP中重定向浏览器有多种方法,在这里使用比较简单的HttpHeader来实现:
header(“location: $gotourl”);



其实像网易那样子的“username.yeah.net”的虚拟域名服务和“@”的实现方法大同小异,但是“.”需要以价值200元的DNS泛解析为代价,而“@”所需要的仅仅是:
1、 PHP/SQL数据库的权限;
2、 真正DNS解析的域名。

假如需要在虚拟域名服务中加入广告,比如网易的Popup窗口,可以将重定向部分改为:
<script>
window.open("url","nease","width=windth,height=height");
</script>

现在,上网的人越来越多,许多网友尝试着制作自己的主页,访客计数器是必不可少的一部分。虽然很多网站提供免费的计数器,可究竟不是自己亲手制作的?有的朋友可能认为它很难,不敢去尝试,其实有了PHP这个工具,它并不难,甚至可以说它很轻易。

首先,让我来谈一谈访客计数器的思路:一位访问者浏览此页,服务器(如Apache)从一个文档(下文以num.txt为例)中读取该页已被浏览的次数,加一,然后存回num.txt,并在浏览器中显示加一后的次数。 假如又一位访问者浏览此页,服务器又重复上述过程,从而实现了访客计数器。

PHP没有直接的计数器函数,但利用它强大的功能,我们可以很轻易地自己编写一个计数器。

现对程序需要用到的函数进行说明:

1. 打开文件操作:int fopen(string filename, string mode);

其中string filename 是要打开的文件名,必须为字符串形式。例如"num.txt"。

string mode 是打开文件的方式,必须为字符形式。

’r’,只读形式,文件指针指向文件的开头。

’r ’,可读可写,文件指针指向文件的开头。

’w’,只写形式,文件指针指向文件的开头,把文件长度截成0,假如文件不存在,将尝试建立文件。

’w ’,可读可写,文件指针指向文件的开头,把文件长度截成0,假如文件不存在,将尝试建立文件。

’a’,追加形式(只可写入),文件指针指向文件的最后,假如文件不存在,将尝试建立文件。

’a ’,可读可写,文件指针指向文件的最后,假如文件不存在,将尝试建立文件。

2. 读文件操作:string fgets(int fp, int length);

其中 int fp 是要读入数据的文件流指针,由fopen函数返回数值。

int length 是要读入的字符个数,实际读入的字符个数是length-1。

3. 写文件操作:int fputs(int fp, string str, int [length]);

其中int fp 是要写入信息的文件流指针,由fopen函数返回数值。

string str 是要写入文件的字符串。

int length 是写入的长度,可选,假如不选length,则整个串将被写入。否则,写入length长度个字符。

4. 关闭文件操作:int fclose(int fp);

其中int fp是fopen函数返回的文件流指针。

下面,我们来看一下计数器的原型:(假设num.txt文件存在)

<?php

$fp = fopen("num.txt", "r");

//只读方式打开num.txt文件

$num = fgets($fp,5);

//读取4位数字

$num ;

//浏览次数加一

fclose($fp);

//关闭文件

<style>
table {font-size = 9pt}
td {height = 20px}
</style>
<body>
<span id="menus"></span>
<span id="view"></span>
</body>
<script for=pad event=onclick>
// 大类节点点击响应
for(var i=1;i<this.parentElement.rows.length;i =2)
 this.parentElement.rows[i].style.display = "none";
this.parentElement.rows[this.rowIndex 1].style.display='block';
view.innerHTML = this.v1 ":" this.v2; // 根据大小类自行构造相应动作
</script>
<script for=bar event=onclick>
// 小类节点点击响应
view.innerHTML = this.v1 ":" this.v2; // 根据大小类自行构造相应动作
</script>
<script>
/**
* 产生菜单的html代码串
* 入口参数为菜单默认打开的大类号
*/
function menu(n) {
  this.ar = new Array(
  /**
   * 参数数组
   * 列1:大类
   * 列2:小类
   * 列3:标题
   */
  new Array(1,0,"大类一"),
  new Array(1,1,"小类一"),
  new Array(1,2,"小类二"),
  new Array(2,0,"大类二"),
  new Array(2,1,"小类一"),
  new Array(2,2,"小类二"),
  new Array(2,3,"小类三"),
  new Array(3,0,"大类三"),
  new Array(3,1,"小类一"),
  new Array(3,2,"小类二"),
  new Array(4,0,"大类四"),
  new Array(4,1,"小类一"),
  new Array(4,2,"小类二"),
  new Array(4,3,"小类三")
  );
  this.width =120;
  this.bgcolor = "#f0f0f0";
  this.bordercolorlight = "#c0c0c0";
  this.bordercolordark = "#FFFFFF";
  this.tr_bgcolor = "#d0d0d0";
  var s = "<table border=1 align=center width=" this.width " bgcolor=" this.bgcolor " bordercolorlight=" this.bordercolorlight " bordercolordark=" this.bordercolordark " CELLPADDING=0 CELLSPACING=0>"
  for(var i=0;i<this.ar.length;i ) { // 构造菜单的html结构,其中将大小类编号作为自定义参数,以便事件响应时使用。
    if(this.ar[i][1] == 0) {
      if(i > 0)
        s = "</table></td></tr>";
      var vk = this.ar[i][0]==n?"block":"none";
      s = "<tr id='pad' bgcolor=" this.tr_bgcolor " v1=" this.ar[i][0] " v2=" this.ar[i][1] "><td align=center>" this.ar[i][2] "</td></tr><tr style='display:" vk "'><td><table width=100%>";
    }else
      s = "<tr><td id='bar' v1=" this.ar[i][0] " v2=" this.ar[i][1] ">" this.ar[i][2] "</td></tr>";
  }
  s = "</table></td></tr></table>";
  return s;
}
/*** 创建菜单 ***/
menus.innerHTML = menu(4);
</script>

<?php
// 禁止直接访问该页面
if (basename($HTTP_SERVER_VARS['PHP_SELF']) == "pager.class.php") {
   header("HTTP/1.0 404 Not Found");
}

class Pager
{
   /** 总信息数 */
   var $infoCount;
   /** 总页数 */
   var $pageCount;
   /** 每页显示条数 */
   var $items;
   /** 当前页码 */
   var $pageNo;
   /** 查询的起始位置 */
   var $startPos;
   var $nextPageNo;
   var $prevPageNo;
 
   function Pager($infoCount, $items, $pageNo)
   {
     $this->infoCount = $infoCount;
     $this->items   = $items;
     $this->pageNo  = $pageNo;
     $this->pageCount = $this->GetPageCount();
     $this->AdjustPageNo();
     $this->startPos = $this->GetStartPos();
   }
   function AdjustPageNo()
   {
     if($this->pageNo == '' || $this->pageNo < 1)
       $this->pageNo = 1;
     if ($this->pageNo > $this->pageCount)
       $this->pageNo = $this->pageCount;
   }
   /**
   * 下一页
   */
   function GoToNextPage()
   {
     $nextPageNo = $this->pageNo 1;
     if ($nextPageNo > $this->pageCount)
     {
       $this->nextPageNo = $this->pageCount;
       return false;
     }
     $this->nextPageNo = $nextPageNo;
     return true;
   }
   /**
   * 上一页
   */
   function GotoPrevPage()
   {
     $prevPageNo = $this->pageNo - 1;
     if ($prevPageNo < 1)
     {
       $this->prevPageNo = 1;
       return false;
     }
     $this->prevPageNo = $prevPageNo;
     return true;
   }
   function GetPageCount()
   {
     return ceil($this->infoCount / $this->items);
   }
   function GetStartPos()
   {
     return ($this->pageNo - 1) * $this->items;
   }
}
?>

WAP(无线通讯协议)是在数字移动电话、个人手持设备(PDA等)及计算机之间进行通讯的开放性全球标准。由于静态的WAP页面在很多方面不能满足用户个性化的服务请求,因此通过WAP服务器端语言产生动态的WML页面,具有很广泛的应用价值和很高的商业价值。

  WAP应用结构非常类似于Internet,一个典型的WAP应用请求是这样的:首先,具有WAP用户代理功能的移动终端(WAP手机等)通过内部运行的微浏览器(Micro Browser)对某一网站以无线方式发送WAP服务请求。该请求先由WAP网关截获,对信息内容进行编码压缩,以减少网络数据流量,同时根据需要将WAP协议转换成HTTP协议,然后将处理后的请求转送到相应WAP服务器。在WAP服务器端,根据页面扩展名等性质,被请求的页面直接或由服务器端脚本解释后输出,再经网关传回用户。

  从上述WAP应用流程可以看到,生成动态WAP页面与动态产生Web网页的过程非常类似。但是由于WAP应用使用的WML语言来源于语法严格的XML,因此要求输出的格式必须按WAP网页的规范输出。同时,由于WAP协议的应用范围、移动客户端的软硬件水平等非凡性,对每次输出的页面的大小、图像的格式及容量都有一定限制。下面我们以PHP脚本语言为例,看看如何动态输出WAP页面。

  一、设置WEB服务器

  首先你的 Web服务器要安装好PHP,即能处理PHP脚本程序。其次,为使Web服务器能同时识别和处理PHP、WML、WBMP等文件,Web 服务器的MIME表需添加以下的几种文件类型。

  text/vnd.wap.wml .wml
  image/vnd.wap.wbmp .wbmp
  application/vnd.wap.wmlc .wmlc
  text/vnd.wap.wmls.wmls
  application/vnd.wap.wmlsc .wmlsc

  二、用PHP输出简单动态WAP页面

  下面有一个最简单的PHP生成WAP页面的例子。注重由于需要PHP解释器来解释该程序,并输出WAP页面,因此所有类似程序应以.php为扩展名。

  <?php
  header("Content-type: text/vnd.wap.wml");
  echo ("<wml> <card> <p>");
  echo date( "l dS of F Y h:i:s A" );
  echo ("</p></card></wml>");
  ?>

  该例子在WAP手机模拟器中可以浏览,输出当前日期时间,而在普通的浏览器中无法识别,甚至会被认为是错误下载。这是因为在程序开头就声明了该输出文档为WML类型,该类型只有WAP设备能够识别并解释。值得注重的是,我们常见的HTML语言对规范性要求不严,大多数浏览器能“容忍”其中相当多的编写错误,而WML规范相当严格,一点失误都可能导致无法输出所需页面。

  一旦我们知道了用PHP脚本输出WAP页面的标准过程,我们就能够使用PHP强大的功能配合以WML语言的交互处理以及WML Script的简单脚本,开发出适合我们需要的应用系统了。

  三、用PHP动态生成图像

  WAP应用使用一种非凡黑白的图像格式WBMP。我们可以用一些工具来将已有图像转换成WBMP格式,然后在WML文档中使用。但是在WAP站点上假如能动态地生成所需图像如K线图等,将会有广阔的应用前景。幸运的是,PHP的GD库(版本1.8以上)已经提供了相应函数。

  <?PHP
  Header("Content-type: image/vnd.wap.wbmp");
  Sim = ImageCreate(50, 50);
  Swhite = ImageColorAllocate(Sim,255,255,255);
  Sblack = ImageColorAllocate(Sim,0,0,0);
  ImageRectangle(Sim, 5, 5, 20, 20, Sblack);
  ImageWBMP(Sim);   ImageDestroy(Sim);
  ?>

  该文件将在WAP模拟器中显示一个黑色矩形框。注重要使用GD的图像函数库,必须在PHP配置中加载PHP_GD.DLL库文件。

  四、在PHP中处理汉字

  WAP作为一种全球应用,选择了UNICODE 2.0作为其标准字符集编码,以便能同时处理包括英文、中文、日文、法文等多种文字。而我们平常处理汉字使用的是GB2312编码,不同的内码标准势必不能通用,因此假如不在两种编码之间通过码表进行转换,就会出现汉字乱码现象。现在已经有较成熟的GB-2312与UNICODE编码转换的程序和函数,并在ASP、PHP、JSP等系统中使用,我们可以在一些技术站点上找到它们。

  目前的大多数WAP手机(Nokia7110、爱立信R320S等等)都是使用UTF-8编码的,也就是采用UNICODE来编码。这样,假如我们直接在WML使用中文字符(GB2312编码),将会产生乱码,手机用户无法识别,所以我们在输出中文之前,要使用程序或函数对中文进行UNICODE的编码。而在少数支持GB2312编码的手机或WAP终端设备中,我们可以在程序中定义好文档的内码类型后即可直接正确显示汉字,例如:

  <?php
  header("Content-type: text/vnd.wap.wml; charset=gb2312");
  echo ("<wml><card><p>");
  echo ("中文测试");
  echo ("</p></card></wml>");
  ?>

[!--infotagslink--]

相关文章

  • 详解nginx同一端口监听多个域名和同时监听http与https

    这篇文章主要介绍了详解nginx同一端口监听多个域名和同时监听http与https的相关资料,需要的朋友可以参考下...2017-07-06
  • 一篇文章带你搞懂Vue虚拟Dom与diff算法

    这篇文章主要给大家介绍了关于Vue虚拟Dom与diff算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-26
  • PHP JS Ip地址及域名格式检测代码

    PHP IP地址格式检测函数复制代码 代码如下:function checkIp($ip){ $ip = str_replace(" ", "", $ip); $ip = strtolower($ip); $ip= str_replace("http://", "", $ip); $ip= str_replace("https://", ""...2013-10-04
  • C#域名解析简单实现方法

    这篇文章主要介绍了C#域名解析简单实现方法,可实现针对域名解析显示出主机名、IP地址、别名等功能,需要的朋友可以参考下...2020-06-25
  • 2015新版godaddy域名续费与过期域名赎回期限及赎回方法

    有许多的新手朋友不知道gd如何续费及过期了域名如何购买回来了,今天我们就一起来看看2015新版godaddy域名续费与过期域名赎回期限及赎回方法吧。 2015新版godaddy...2016-10-10
  • 玩转虚拟域名◎+

    玩转虚拟域名◎+ . 不知道大家最近上网是否发现一个新现象,就是有一些网站开始提供“username@server”的虚拟域名服务。由于“@”的魅力,大家纷...2016-11-25
  • Godaddy注册域名怎么转出到万网

    今天给域名续费的,实在找不到可以便宜的优惠码了,就干脆直接转到万网好了!!39¥比之前使用了优惠码的50多还便宜不少! 申请转出之前请大家务必注意两点问题: 1、之前购买...2016-10-10
  • godaddy域名转出西部数码图文详解

    godaddy域名转出西部数码要如何转呢,因为许多新顶级域名在国内许多服务商不支持,特别是高价域名更不支持了,下面我们来看godaddy域名转出西部数码的方法吧. 1、域...2016-10-10
  • Nginx批量添加二级子域名完美方案

    这篇文章主要介绍了Nginx批量添加二级子域名完美方案,本文讲解使用正则表达式批量匹配指定域名的二级域名虚拟主机,需要的朋友可以参考下...2016-01-27
  • docker内网搭建dns使用域名访问替代ip:port的操作

    这篇文章主要介绍了docker内网搭建dns使用域名访问替代ip:port的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-22
  • nginx配置域名访问时域名后出现两个斜杠//的解决方法

    最近这两天重新写了一下我的个人网站,在阿里云新买了一台服务器,配置好以后出现了一个问题,就是输入域名后域名地址会自动在后面追加两个斜杆,需要的朋友可以参考下...2020-07-10
  • C#通过域名获得IP地址的方法

    这篇文章主要介绍了C#通过域名获得IP地址的方法,涉及C#中GetHostByName方法的使用技巧,需要的朋友可以参考下...2020-06-25
  • Godaddy域名DNS服务器地址怎么修改?

    Godaddy是全国10域名注册商之前,现在有很多站长都选择在Godaddy注册域名了,那是使用Godaddy dns解析感觉不如国内的好,那么我们要如何把Godaddy注册域名的dns修改成其它...2016-10-10
  • forum.php怎么去掉?Discuz教程/X3彻底去掉域名后面的/forum.php的方法

    在安装discuz论坛源码的时候,我们会发现,链接的尾部多了一个forum.php,那么如何去除呢?下面详细讲解一下! 一、Discuz x3去掉主域名后面的/forum.php的方法修改方法:进...2017-07-06
  • 根据域名调用城市信息[全国二级域名]

    根据域名调用城市信息[全国二级域名] 本文章为你做一个页面,根据用户输入的域名调用不同城市的信息 function getServerName() { $ServerName = strtolower($_SE...2016-11-25
  • php获取url地址中的域名几种方法

    在由变量传过来的一个完整的url地址,我们需要取得地址中的域名,这里可以使用parse_url函数来处理,当然有用户使用正则来解决都是可以,下面看两个例子。 方法1php自带...2016-11-25
  • 企业做网站该选择什么形式的域名

    每个做网站的人都知道,域名对网站是很重要的,那么网站应该选择什么样的域名呢?拼音域名好还是英文域名好,不清楚的下面跟小编一起来看看。 小编是**座,在面对一些选择...2017-07-06
  • 使用rewrite 来配置 apache二级域名

    ServerName www.111cn.net ServerAlias *.111cn.net 111cn.net RewriteEngine on RewriteCond %{HTTP_HOST} ^((?!www)w)+.111cn.net$ RewriteRul...2016-11-25
  • IIS绑定域名图解教程

    这篇文章主要为大家介绍下IIS中绑定域名的方法,需要的朋友可以参考下...2016-01-27
  • IPwhois查询,域名whois查询

    <div class=contentbox> <div class="content_nav"><span class="tt">IP/域名WHOIS查询</span></div> <div class=toolitem> <br> <form action="" method="get">...2016-11-25