现在的位置: 首页 > 综合 > 正文

实现虚拟域名

2013年01月19日 ⁄ 综合 ⁄ 共 8146字 ⁄ 字号 评论关闭
 
实现虚拟域名
 
     

完整实现虚拟域名要三个条件:
1、DNS服务器泛域名解析设置; 2、WEB服务器泛域名绑定设置; 3、浏览器支持(3.0以上的都支持);这三个条件满足了,然后在虚拟主机上用虚拟域名CGI程序实现象 my.yeah.net 一样的虚拟域名。   

下面的文章分别介绍NT和UNIX的实现方法。 NT 下虚拟域名的实现 --转贴 - 飞云飘渺 08-19-2000 19:58   

虚拟域名实际上是虚拟主机的一种。 虚拟主机的出现是为了节省硬件的投资。如果 ISP 为每个申请了域名的用户都使用一台单独的机器,显然费用会很高,而且对于访问不是很频繁的站点来说也是一种浪费。所以就出现了大家公用一台机器,但每个用户之间相互独立,功能完全等同与拥有自己的主机。   

虚拟主机分为基于 IP 地址的( IP-based )和基于名称的( name-based )两种。基于 IP 地址的虚拟主机大家虽然在同一台机器上,还是要给每个域名配置独立的 IP 地址,这样看来还不能算是一种很理想的方案。有没有用一台机器、一个 IP 地址,又能实现独立的域名呢?   

这个想法随着 http/1.1 协议的出现得到了实现。它的原理是用 Web 服务器和浏览器共同作用来实现把虚拟的域名与相应的目录或站点对应。这样用户在浏览器里输入不同的名字,虽然由 DNS 服务器解析出的是同一个 IP,但得到的却是不同的内容。看上去就象两个独立的域名了。所以这种基于名称的虚拟主机又称为非 IP 的( non-IP )。这同时还有一个用处,可以给很长的 URL 起一个即好记又有意义的别名。这就是虚拟域名。   

实现虚拟域名要有两方面的支持:   

一是 Web 服务器: 现在有很多的 Web Server 支持基于名称的虚拟主机。象 Netscape ,IIS 等都支持。当然用的最多的还是 Apache Web Server ,究其原因是因为它配置方便,还是免费的,而且它是第一个实现了基于名称的虚拟主机的服务器产品。   

二是用户的浏览器: 我想大家使用的决大多数应该是 3.0 版本以上的 IE 或 Netscape ,那就没问题了,它们都支持。 下面我们就来看看在 NT 下如何实现虚拟域名:   

第一步是要 DNS 服务器认识你要增加的域名,也就是把它解释成相应的 IP 地址。因为我们要靠 Web 服务器来区分域名,所以这个 IP 地址自然得是你 Web Server 所管理的了。   

你所要做的就是 DNS 服务中增加一个别名记录,假定你要增加的是 aaa.domain.com ,想要指到 www.domain.com ,就可写成: aaa IN CNAME www.domain.com .   

也许你会想如果我要增加很多域名,那不是很麻烦,而且 DNS 服务器的记录文件要很大喽。好,我们来骗一下 DNS 服务器,把“ aaa ”改成“ * ”,这样它就把所有没给出设置的以 domain.com 结尾的记录全部转到 www.domain.com 去了,不管是 aaa.domain.com 还是 bbb.domain.com 。这不会影响已有的记录。   

下一步就要配置 Web 服务器了。我们选两个常用的:IIS 和 Apache for NT 。   

一、 IIS (记住,只有 4.0 版以上才支持基于名称的虚拟主机。)   

进入 IIS 的服务管理器,在相应的服务器上选择新增 Web 站点,给站点起个名字,选择好 IP 地址(也就是前面设好的由 DNS 服务器所指向的)。选择好主目录路径,如果是映射到远端的 URL 的话,可以先设个临时的路径。   

完成后进入新建的 Web 站点的属性,在“ Web 站点”的标签里点“高级 ...”按钮,编辑标识记录,在“主机标题名”处填写要加入的虚拟域名,如:aaa.domain.com ,记住要填完整,不能光打 aaa 。现在可以到“主目录”的标签里选择要映射的具体目录了,可以是本机器或本网机器上的路径,也可是远端站点的 URL 。   

IIS 配置起来直观,但如果是有大量的记录就不适合了,而且也不适合在线申请。   

二、 Apache (新版本已经开始支持 NT ,你可以到 http://www.apache.org 去得到最新的版本,并且带源代码,有兴趣可以自己开发些新功能)   

配置 Apache 需要跟配置文件 http.conf 打交道,缺省情况它位于 Apache/conf 目录下。   

首先需要加入 NameVirtualHost xxx.xxx.xxx.xxx   其中 xxx.xxx.xxx.xxx 为你虚拟服务器的 IP 地址,也就是上面例子 www.domain.com 的 IP 地址。在此可配置多个虚拟 IP 地址。(注意:这里要用 IP 地址,不要用域名)   

接下来为每个虚拟域名加入记录: ……   xxx.xxx.xxx.xxx 要和 NameVirtualHost 的一致。在两个标志之间可加入的配置参数有:    ServerName 后面跟你要增加的虚拟域名,如 aaa.domain.com ;   

Documentroot 如果你映射到本机的路径就加在后面,如 "F:/html/aaa"(需要加双引号);    redirect 如果你映射到远端的 URL 可加在后面,有两个参数,第一个是虚拟域名的相对路径,第二个是远端站点的 URL ;    ServerAlias 后可加入本域名的别名,可使用通配符,如:*.aaa.domain.com 。   

下面举几个例子:   1.映射到本机的物理路径: DocumentRoot "F:/Program Files/Apache Group/Apache/htdocs/test" ServerName test.domain.com   2.映射到远端的 URL : ServerName test1.doamin.com redirect /http://test.domain1.com/welcome.htm 当然还有许多参数,象 log 文件的位置、超时的设置、缓冲区的设置等等,可以参考 Apache 的在线帮助文件。每增加一个虚拟域名就要增加一段位于 ... 之间的配置代码,而且只有在重新启动 Apache 后新配置才能生效。   

显然如果要配置大量的记录将大大增加配置文件的长度,这样会还会使 Apache 启动变慢,占用更多的内存,而且也不容易实现在线申请。你可以通过选择动态方式来配置虚拟主机。这样你不必事先写好配置,而是通过编写一定的动态规则来自动生成或随时从独立的配置文件中读取信息。这要用到 Apache 的 mod_rewrite 模块,所以要在配置文件里加一行: LoadModule rewrite_module modules/ApacheModuleRewrite.dll   

你可以制定很多规则来重写 URL ,象通过环境变量、http 协议头,甚至是通过外部的数据库来维护 URL。它的功能非常强大,也就同时带来了复杂性,你得通过不断的摸索和实验来真正掌握它,不过这是很值得的。   

最后简单的介绍一下在线免费域名的一种实现:   1.通过 Perl 来维护一个用户数据库,管理用户的增删、验证和密码更改等工作。   2.同时用 Perl 来通过数据库维护独立的虚拟域名的配置文件,例如:vdomains.map ,格式如下: aaa.domain.com http://www.domain1.com/~aaa bbb.domain.com http://www.domain2.com/~bbb ...   

3.最后配置 httpd.conf 文件。用 RewriteEngine On 打开 rewrite 模块,用 RewriteMap 设定配置文件的位置和属性,用 RewriteCond 和RewriteRule 制定相应的规则即可。

Linux 下虚拟域名的实现 DNS 服务器的设置   

我们知道互联网网是基于 TCP/IP 协议的,要进行通信必须获得对方的 IP 地址,这是通过 DNS 服务器来实现的。因此要想实现虚拟域名首先应当令 DNS 服务器接受该虚拟域名,即把它映射到指定的 IP 地址上。因为我们靠 Web 服务器来区分域名,所以这个 IP 地址自然应当是 Web 服务器所管理的。   

RedHat6.0 操作系统中捆绑有 BIND DNS 服务器。它的域名配置文件是 "/etc/named.conf",一般情况下,域配置文件放在 "/var/named" 目录下面。   named.conf 文件的配置: zone "domain.com" { type master; file "domain.com"; }; zone "0.10.10.in-addr.arpa" { type master; file "10.10.0"; };   

该例子说明 "domain.com" 的域配置文件是 "/var/named/domain.com" ,反向域的配置文件是 "/var/named/10.10.0" 。domain.com 文件负责把 DNS 域名映射为 IP 地址。   domain.com 文件配置: @ IN SOA dns.domain.com. hostmaster.dns.domain.com. ( 1998111003 ; serial 3600 ; refresh 900 ; retry 1209600 ; expire 43200 ; default_ttl ) @ IN MX 10 dns.domain.com. @ IN NS dns.domain.com. @ IN A 10.10.0.1 www IN A 10.10.0.1   

假定要增加的域名是 aaa.domain.com ,想要指到 www.domain.com , DNS 服务中应增加一个别名记录,可写成:aaa IN CNAME www.domain.com .   如果需要配置大量的虚拟域名,domain.com 文件要很大,而且也相当麻烦。我们可以使用符号 "*" ,即在 domain.com 文件中加入: * IN CNAME www.domain.com .   

这样它就把所有没给出设置的以 domain.com 结尾的记录全部转到 www.domain.com 去了,不管是 aaa.domain.com 还是 bbb.domain.com 。这不会影响已有的记录。 配置好 DNS 服务器后应该重新启动守护进程 named:[root@domain /root]# /etc/rc.d/init.d/named restart

-------------------------------------------------------------------------

Apache 服务器的配置   Apache 服务器是目前互联网上使用最多的 Web 服务器,它可以维护非常繁忙的站点。 RedHat 6.0 捆绑了 Apache Web Server 1.3 。它的配置文件位于 "/etc/httpd/conf" 目录下,有 httpd.conf 、 srm.conf 、 access.conf ,下面讨论一下与虚拟域名有关的配置:   

1.静态配置   修改配置文件 httpd.conf 的步骤:    (1) 首先设置 UseCanonicalName 为 off 。它指示用服务器 Host:header 的内容代替 ServerName 的值来提供给环境变量 SERVER_NAME 。    (2) 然后加入: NameVirtualHost xxx.xxx.xxx.xxx    其中 xxx.xxx.xxx.xxx 为所要配置的虚拟服务器的 IP 地址。在此可配置多个虚拟 IP 地址,当然要与 DNS 服务器中的配置一致。(注意:这里要用 IP 地址,不能用域名。)    (3) 接下来为每个虚拟域名加入一段记录: .....   xxx.xxx.xxx.xxx 要和 NameVirtualHost 配置的 IP 地址一致。在两个标志之间可加入的配置参数有: ServerName 后面跟你要增加的虚拟域名,如 aaa.domain.com ; Documentroot 如果你映射到本机的路径就加在后面,如 "/home/aaa" ; redirect 如果你映射到远端的 URL 可加在后面,有两个参数,第一个是虚拟域名的相对路径,第二个是远端站点的 URL ; ServerAlias 后可加入本域名的别名,可使用通配符,如:*.aaa.domain.com 。   

下面举两个例子:   例 3.映射到本机的物理路径: DocumentRoot "/home/test" ServerName test.domain.com   例 4.映射到远端的 URL: ServerName test1.doamin.com redirect /http://test.domain1.com/welcome.htm   还有一些参数,象 log 文件的位置、超时的设置、缓冲区的设置等等,在此不一一介绍,可以参考 Apache 服务器的在线帮助文件。配置好 httpd.conf 文件后需要重新启动 Apache 的后台守护进程 httpd , [root@domain /root]# /etc/rc.d/init.d/httpd restart   每增加一个虚拟域名就要增加一段位于 ... 之间的配置代码,而且只有在重新启动 httpd 后新配置才能生效。   

2.动态配置   可以发现,如果要配置大量的虚拟域名将大大增加配置文件的长度,这样还会使 Apache 启动变慢,占用更多的内存,而且也不容易实现在线申请。可以通过选择动态方式来配置。这样不必事先写好配置,而是通过编写一定的动态规则来自动生成或随时从独立的配置文件中读取信息。   

Apache 有一个强大的扩展功能,即模块( Modules )的特性。模块可对服务器的功能进行扩充,它在运行和使用时才装入服务器,这样比一直放入服务器中要节省内存空间,同时也比调用外部 CGI 程序速度快。   现在使用一个功能强大的模块来实现动态配置虚拟域名,这就是 mod_rewrite 。它负责侦听从客户机送出的 URL 地址,并基于一组规则表达式对该 URL 来进行重写。这类似于 URL 别名概念,但它更进了一步,输出的 URL 可以映射到其他主机的任何 URL 地址上。

修改配置文件 httpd.conf 的步骤:    (1) 先设置 UseCanonicalName 为 off 。    (2) 使用 RewriteEngine on 打开 rewrite 引擎。用 RewriteMap 设定配置文件的位置和属性,用 RewriteCond 和 RewriteRule 制定相应的规则。   例 5.httpd.conf 文件中相关配置的一个例子: RewriteEngine on RewriteMap lowercase int:tolower # 定义独立的配置文件的位置 RewriteMap vhost dbm:/www/conf/vhostdbm # 利用独立的配置文件重映射虚拟域名 RewriteCond ${vhost:%1} ^(/.*)$ RewriteRule ^/(.*)$ %1/docs/$1 RewriteCond %{REQUEST_URI} ^/cgi-bin/ RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$ RewriteCond ${vhost:%1} ^(/.*)$ RewriteRule ^/(.*)$ %1/cgi-bin/$1   这里的 vhostdbm 文件格式见 "CGI 程序的编制 " 。

-------------------------------------------------------------------------------

CGI 程序的编制   要实现虚拟域名的在线申请,就必须编写相应 CGI 程序动态修改独立的配置文件(即上面的 vhostdbm 文件)和进行用户的管理(包括用户申请,登录,密码修改等等)。在此只介绍对独立的配置文件的操作,其他属于如何用 Perl 语言来编写 CGI 程序,请参考有关资料。   

vhostdbm 文件使用 dbm 格式来记录数据,与用普通文本文件相比可加快寻找速度,而且易于修改。许多 UNIX 系统都具有叫做 dbm ( database management )的标准库。该库将键 - 值对的集合存贮到一对磁盘文件中,提供简单的数据库管理工具,可以方便的更改、新增或删除数据内容。   

Perl 访问 dbm 的方式:通过一个类似于打开文件的进程将关联数组与 dbm 数据库联系起来。在数组中创建新元素时立即就更改了 dbm 数据库。删除一个元素的同时也删除了 dbm 数据库中的数值。可使用:   

1 、欲将 dbm 数据库与 dbm 数组相关联起来: dbmopen(%arrayname,"dbmfilename",$mode);   如果 dbmfilename 不存在的话就新建该库。 %arrayname 参数是 Perl 的关联数组(如果这个数组已经有值,那么这些值就被删除)。该关联数组连接到叫做 dbmfilename 的 dbm 数据库中。$mode 参数是当需要创建库时控制库文件权限的数字,该数字被指定为 8 进制,经常被用到的是 0644 ,给除了机主之外的新用户以只读的权限,机主可有全部权限。   

2 、关闭 dbm 库: dbmclose(%arrayname); %arrayname 是已经与 dbm 库关联了的数组名。   例 6 .以 VHOST 打开 vhostdbm ,或新建一个 dbm 库: dbmopen(%VHOST,"vhostdbm",0644);   例 7 .新建记录或更改已有记录(设从 html 文件 form 中传过来的参数名为 vhost 、rhost): $VHOST{$FORM{'vhost'}}=$FORM{'rhost'};   例 8 .删除已有记录(设从 html 文件 form 中传过来的参数名为 vhost ): delete $VHOST{$FORM{'vhost'}};   例 9 .关闭 vhostdbm : dbmclose(%VHOST); 注:以上已经假设传过来的参数经过了验证,不存在重复的记录,否则会导致已有记录的混乱。

泛域名解析-nt

泛域名解析是指创建一个域以后,比如,创建了 abc.com 域,如何配置使任意的 xxx.abc.com 都可以解析到一个地址,有文章说,在 service pack4 就已经解决了这个问题(因为在Unix上实现起来非常容易的),实际上并没有解决。当微软的 sp6a 出台之后,这个问题解决了,配置也是相当容易。相关下载地址: http://download.microsoft.com/download/winntsp/Install/6.0a/NT4/CN/SP6I386.EXE   

如果在NT4.0上打了这个补丁,问题很好办了。打开dns管理器,创建 abc.com 域,在该域中创建 A 记录(主机记录),主机名字填上一个 * ,并且加上相应的地址 a.b.c.d ,这样,任意的 xxx.abc.com 都会解析到地址 a.b.c.d 。当然,对于特定的主机记录,解析也不会有任何问题。   

可以测试:xxx.chinaasp.org,负责解析的主dns服务器:ns.chinasp.com(202.101.18.171) scud

在当前域创建一个名字为 * 的子域,在子域里面创建一个主机名为空的主机。

unix/linux 下泛域名设置举例

1.dns: ........... @ IN A 202.11.11.11 * IN A 202.11.11.11 ........... 2.apache: ................. ServerAlias yourname.net www.yourname.net ServerAlias www.yourname.net *.yourname.net ServerName www.yourname.net ................. ip、域名改成自己的就可以了

2.apache: ................. ServerName www.yourname.net ServerAlias yourname.net www.yourname.net *.yourname.net .................

以上文章转自: http://www.coolwww.net

虚拟域名CGI程序下载地址: http://www.coolwww.net/cgi/free.htm

这里有另外一个CGI程序的实现方法: http://cgi.chinalb.com / http://cgi.chinalb.com/write/1-4.htm

 

抱歉!评论已关闭.