大家在使用諸如yourname.yeah.net這樣的簡記域名時都感到十分方便,有很多人在想:我要是能讓自己的服務器也能夠實現簡記域名就好了。其實這並不複雜。看完了本文,你也可以做一個簡記域名系統。 : ]: T" y0 {* Y5 m1 j5 Z
! X& x) N8 _. r* Q6 E4 C 簡記域名系統的關鍵技術在於:實現Web頁面的重定向(Redirctory)。在本質上,簡記域名系統和虛擬機系統完全不同。虛擬機的虛擬域名和IP是存在一一對應關係的。而簡記域名系統不需要將域名和IP做一一映射。也就是說,它根本不需要複雜的域名解析機制和虛擬機來完成,它所做的事情就是當你在請求yourname.somedomain時,將你的瀏覽器重新定向到你本來存放Html頁面的地方。
! X$ z- }7 J9 X& p3 S, F( v5 A6 F, X6 W5 L i4 D- V! W* }. p' w6 l
為了說明的更完善,下面圖例: ' m" u) U; W0 B$ a' e' P
1 R+ _2 T; a* I; y4 | 我提供的源程序是運行環境是:RedHat 5.1 Linux下的Apache1.3.6 Web服務器+PHP3語言。 在編寫程序之前,我們首先要設置好我們的服務器。首先要讓Apache服務器支持php3。到ftp.redhat.com下載mod_php-2.0.1-9.i386.rpm,安裝後,修改/etc/httpd/conf/http.conf文件,去掉#LoadModule php3_module一句前面的#註釋號,同樣在/etc/httpd/conf/srm.conf文件裡去掉#AddType application/x-httpd-php3 .php3前面的註釋號,同時在DirectoryIndex一項後添加index.php3。重新啟動Apache Server,此時服務器就支持標準的php3語言腳本文件了並能將index.php3作為默認的首頁。
7 `* T8 N' M7 s6 I- w 設置DNS服務器,使其能對泛域名解析。一般的Unix和Linux系統的DNS解析都是由Bind守護程序完成的,Bind4和Bind8的配置文件分別/etc/named.boot和name.conf,配置時根據你的系統修改。設置Bind的配置文件/etc/named.boot,在其中加入「primary domain.com db.domain」一句,添加一個新的域記錄。在/etc/name.conf中加入:
( F/ R+ Y+ p5 v. o' @$ G } |# l7 H) f% v% H9 G
zone "domain.com" { 3 E6 o8 i# H4 e# A/ i* }. H* B
type master; 6 J3 h9 ?* v* `
file "db.domain」; 5 H" P7 b: ], Z; @$ N+ u' X
}; $ H6 e/ F) g7 N# k
在/var/name/中新建主域記錄文件db.domain,其格式為: 6 l2 E- r0 @" ], X8 S
N SOA dns.domain.com root.domain.com (
; f" u" s" i e0 K. q. T' H$ D" Z( _ 199811291 ;Serial
6 q* s/ K. H4 W 28800 ;refresh ' u) h+ U c7 ? K
7200 ;retry , K4 \% d+ Y; \6 F2 s4 d$ l
604800 ;expire
; w$ l9 f$ l2 G. a I 86400) ;minimum 2 q6 X+ y* C l [8 q
dns 5 L2 o5 V% N/ _
MX 10 dns.domain.com.
" L4 e; ~2 `4 K% b6 g dns A 202.115.135.50
3 g; A& }; @% f- z' s www A 202.115.135.50 9 s0 Q+ V6 p" z* R6 I
* A 202.115.135.50
/ Z+ o$ @1 k2 b Y$ ?0 }$ w% C; ^0 K 關鍵是最後一句,即將整個域可能出現未做標記的所有Hostname全部指向同一IP。 執行/usr/sbin/ndc reload,重新加載域名數據庫。測試一下,此時應該隨便ping一個domain域內的主機(除已經標記的),都指向了指定的IP,那麼DNS服務器設置完成。 % W; B% [1 s8 w1 Q+ D
5 R5 K& V& K3 S5 C& h2 P
; h/ _1 I. Q( c% O6 H 最後一步是編製PHP3腳本。我們剛才已經在圖中詳細的說明了整個的原理,所以寫一個重新定向的程序就不是很難了。
% g/ f3 F5 S8 P" J9 J5 [0 x3 J- V- F# o: n, @& V8 z1 u
5 z8 o. Z9 K. v% @ 讓我們來看一個由IE5.0送出的完整HTTP頭信息:
3 @3 b- r$ I4 p' P6 k( X/ Q* F% l+ [3 b* L- c
4 ]5 f5 d5 N4 V+ G0 `$ g- A
Accept: application/vnd.ms-excel, application/msword, application/vnd.ms-powerpoint, image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
* \- C4 k* J8 n7 d; B; [' e I Accept-Encoding: gzip, deflate
# N) P5 f/ v& {+ m; m( k7 M, E Accept-Language: zh-cn
$ I4 P3 e% b/ p9 t2 [$ J Connection: Keep-Alive
2 {" ?$ i" s9 _- F4 U Host:ww.yahoo.com
1 _0 P% n& V% P: m; G6 ^' g User-Agent: Mozilla/4.0 (compatible; MSIE 5.0b1; Windows 98) 3 `7 a- s; ]) L$ Y% V
我們需要在整個HTTP頭信息中取出Host信息,然後http://www.jj.jx.cn/www.xxx.xxx/default.htm形式的第一部分「www」,即HostName(也即是用戶註冊的name)單獨取出,作為重定向檢索的關鍵字。 9 e9 e) Y6 E, h: P& ?, V
6 ~6 e0 _: Q0 V; d3 G6 o, X6 R
檢索到用戶註冊的URL信息後,我們給用戶瀏覽器送一個重定向命令「Localtion: http://www.jj.jx.cn/somewhere/sample.html」,將用戶重定向到指定頁面。 3 T0 C+ g4 T, B; X/ I
4 w. f1 J/ c: x, |* b1 k
' g: A' a7 x9 ~& J
在PHP3中,有函數GetAllHeader(),取得瀏覽器送出的HTTP頭信息。我們主要需要使用此函數來完成整個程序。
8 E- g* `1 H) g- R& {8 D9 ]0 _& i0 F: }) e
# C; b- q# u8 \) c
後面附有源程序,由於只是實驗性質的,所以在查詢用戶信息時,沒有使用數據庫,如果整個系統要實際應用的話,一定要和數據庫掛接起來,不然查詢用戶信息的過程將是十分漫長,大大影響效率,而且用戶數據的管理也不方便。(由於篇幅限制,沒有給出註冊和管理所需的寫記錄程序,請自行添加)
$ }& A3 b! c% y6 e Y
% u* m+ W# a( m, V* V) j- W+ P6 L9 g# ]7 ?
在源程序中,所有用戶信息記錄在data子目錄下user.dat文件中。其格式為: $ s, _ G% Y+ C% A
& s* s6 l/ z+ o. R+ x
( O& D0 G2 Q% g7 p8 n* j# O
username: 7 S: v/ o W0 {' k0 Q
6 v' C5 E" c! v6 f8 D# G7 V! z0 _* c, U8 ^& P+ u P2 j) H6 E
http://octopus.cdit.edu.cn/~qap213/index.html ; 9 v9 H2 e- D H1 o, T1 i
$ ]5 P* ^. }7 G' \) m" w6 d
: Q0 q5 U* o" q 附PHP3源程序: / G I; ^+ {% f% B/ L; T5 m$ G
9 @( _0 F) O$ ]+ r! A# R+ U" Z& J
0 X7 M! }. B* ~7 @, I5 W1 g <? : d: J2 E0 U- `) m" K. O+ D
//Get HTTP』s Header and parse it// , v$ q, X6 s5 \/ ?/ m; ~1 H
$headers = getallheaders(); $ v, J6 s/ J* c' w$ d- k3 p
while (list($header, $value) = each($headers)) { . }3 w- G/ x9 D$ m
if($header=="Host"){$username= strtok($value,".");}} ! C# A; z2 m, Y5 D$ b
//Jump out the Banner's Window//
5 p' |; N( {& [+ [0 \8 Z* t echo '<script language="JavaScript">', . `9 U# ]" |% h$ I1 `( v5 X
'msg=window.open("banner.htm","sample", # J. N& g$ ^* J- g- H
"toolbar=no","directories=no",directories=no","menubar=no");』,
% C Q2 O$ [5 g+ g3 Z0 g5 Q# ~, K '</script>';
5 W7 _4 f6 n, y9 p // seek the user information from the recorded file//
9 R: {5 e" V' W, r if(!$usrinfo=file("data/user.dat")){echo "Open Data File Error!!";}
# V; [7 e& f: q: u' _2 s- x" Y $url="http://";
: t+ R! s+ Z, a5 t, Y) u% } for($i=0;$i<count($usrinfo);$i++)
6 F% @" U) E- ]! Z' t if(strtok($usrinfo[$i],":")==$username){ ' ]5 f3 o% B* m0 n
$url=$usrinfo[$i+1];
6 r1 J1 ~; ?& q- v5 ` }
2 |; V+ n' G) s% j, M$ _% q if($url=="http://"){echo "not found the uesrname of Data!";}
% }3 C: t5 k1 d1 {; c else{
. y6 A# D3 i8 p1 [1 c1 f5 _& g3 _ echo '<meta http-equiv="refresh" content="0;','url=',$url,'">';} q0 M L# [1 g( W1 ^5 p+ W) U& L
?> + o5 N1 h$ u4 K: A
4 k0 P$ }- o5 k4 A# r8 d& ^( p3 N
& H+ \( x3 x, r' Q' s --END-- |
|