1. 程式人生 > >簡單快速的Apache二級域名實現方法介紹

簡單快速的Apache二級域名實現方法介紹

首先,你的擁有一個有泛域名解析的頂級域名,例如: domain.com

其次,在 httpd.conf 中開啟 mod_rewrite

之後,在 httpd.conf 的最後,新增以下內容:

RewriteEngine on

RewriteMap lowercase int:tolower

RewriteMap vhost txt:/usr/local/etc/apache/vhost.map

RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$

RewriteCond ${vhost:%1} ^(/.*)$

RewriteRule ^/(.*)$ %1/$1

其中的 /usr/local/etc/apache 是你的 apache 伺服器配置檔案所在路徑,根據實際情況更改。

然後,在這個所在路徑的目錄下建立一個檔案: vhost.map

內容為:

www.domain.com /usr/local/www/data-dist/domain

bbs.domain.com /usr/local/www/data-dist/bbs

anyname.domain.com /usr/local/www/data-dist/anyname

以上部分都是:" 域名+空格+絕對路徑" 的形式。

最後,在你的網站根目錄 /usr/local/www/data-dist 下,建立對應目錄:

domain , bbs , anyname 等等,理論上可以無限。

這樣,通過瀏覽器,訪問 www.domain.com 時,實際上訪問的就是 /usr/local/www/data-dist/domain目錄下的檔案。同理,訪問 bbs.domain.com 實際上訪問的就是 /usr/local/www/data-dist/bbs 目錄下的檔案。而且,你可以

隨時更改 vhost.map 來增加、刪除、修改你的二級域名和所指向的實際路徑,不用重啟 apache。

如何開啟mod_rewrite

僅作為備忘.

在apache的 httpd.conf中 去掉下面一行前面的#,

LoadModule rewrite_module modules/mod_rewrite.so

重啟apache生效。

目錄許可權設定:

Apache的httpd.conf中找到網站目錄對應的

"AllowOverride None"

改為

"AllowOverride FileInfo Options"

因為如果設定為"AllowOverride None"

.htaccess中的rewrite指令對該資料夾就無效了

apache Rewrite 二級域名設定

在httpd.conf中,對某個主機進行以下操作:

<VirtualHost ip:80>
        rewriteengine on
        rewritecond %{HTTP_HOST} [^.]+\.域名\.com$
        rewriterule ^(.+) %{HTTP_HOST}$1 [C]
        rewriterule ([^.]+)\.域名\.com(.*) /$1$2
        其他配置檔案
</VirtualHost>

接著在DNS中開設一個泛解析到對應的IP地址。
就可以實現下面的方案。

域名:domain.com
絕對路徑:/home/domain.com/
www.domain.com 自動解析到 /home/domain.com/www/
abc.domain.com 自動解析到 /home/domain.com/abc/
等等子域名都可以自動解析到 /home/domains.com/對應子域名名稱的資料夾

直接建立子域名名稱的資料夾即可使用。不需重啟apache。

泛域名解析就是將客戶的域名全部解析到同一個IP地址。
例如客戶的域名a.com,之下所設的*.a.com全部解析到同一個IP地址上去。
比如客戶設b.a.com就會自已自動解析到與a.com同一個IP地址上去。

泛域名是指  *  IN  A   123.123.123.123 或  *   IN  CNAME www.aaa.com

泛域名解析的用途:

1.可以讓域名支援無限的子域名(這也是泛域名解析最大的用途)。
2.防止使用者錯誤輸入導致的網站不能訪問的問題。

在DNS伺服器裡面設定泛域名解析有2種方式

1. 在域名解析裡面設定 *.a.com的A記錄或者CName 記錄指向某一個IP/伺服器名(這種方式 虛擬主機使用者是不支援的)
2. 在域名轉發裡面設定 *.a.com 轉發到 http://www.a.com( 虛擬主機可以支援這種轉發方式,使用者在自己的程式中可以判斷訪問者要訪問的域名),我們會在程式技術文件裡面講解

例子二:
http://www.xuega.com/klein/blog/article_321.html
 
實現動態二級域名解析的一個關鍵就是,把特有的名字怎麼能夠提出來,因為RewriteRule中的匹配,是不包括域名的匹配的,其實這其中就是一層窗戶紙,把域名先重寫放到“路徑”中,再對“路徑”重寫一次就可以了,也就是說加一步過渡。這樣說大概還一頭霧水,給個例項。

首先按我上次寫的文章的那個需求寫一個,假設動態解析*.iecn.cn。

注意要先做一個所謂的範域名解析,就是說把所有*.iecn.cn解析到某個IP上去,這不是本文章討論範圍就不細說了。

Apache中相關配置如下:

<VirtualHost _default_:80>
ServerAdmin 
DocumentRoot /YourWwwRoot/.default
ServerName all-sites
ErrorLog logs/all-sites-error_log
CustomLog logs/all-sites-access_log common
# 下面三行實現動態解析
RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/(.*)$ /%{SERVER_NAME}/$1 ##注##
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/(.*)$ /YourWwwRoot/$1/$2 [L]
# 沒有解析到的情況下扔到自己的一個PHP中做一下處理
RewriteRule ^.*$ /index.php [L]
</VirtualHost>

注意我標註的地方,那一步就是一個過渡,說一下過程吧,假設現在訪問:
http://zhong.iecn.cn/xxx
經第一步重寫,變成 /zhong.iecn.cn/xxx
經第二步重寫就是 /YourWwwRoot/zhong/xxx 了,其他的操作與我行前說的基本就差不多了。

同意先做範域名解析這裡不多說。在Apache中做如下重寫(只寫Rewrite部分了):

RewriteCond %{HTTP_HOST} ^[a-z0-9\-]+\.iecn\.cn$
RewriteRule ^/?$ /%{HTTP_HOST}
RewriteRule ^/([a-z0-9\-]+)\.iecn\.cn/?$ /blog.php?u=$1 [L]


Apache下用rewrite實現任意域名的動態解析

Apache的mod_rewrite模組功能非常強大,我以後會寫更多的例項出來。

如果你只是想用一個現成的你可以直接把我的copy過去改改,如果想從技術上搞清楚,那麼首先要掌握兩方面的技術:
Apache下mod_rewrite的使用(可參照我上面提供的兩個地址)
正則表示式(這是一門在很多地方都非常有用的技術)

廢話不多說,說一下我在IECN.NET伺服器的實際配置。

我習慣使用NameVirtualHost,如果你的伺服器中只想用這種動態的解析,直接在配置檔案中做是一樣的,如果想保留自己一些特殊站點的配置,還是用NameVirtualHost吧。

在Apache中,如果啟用了NameVirtualHost,在沒有匹配到的解析的情況下,會預設到第一組VirtualHost中,所以我們的動態解析自然是放到第一組VirtualHost(有關apache的一些配置這裡就不多說,自己查閱相關文件。),如下:
<VirtualHost _default_:80>
    ServerAdmin 
    DocumentRoot /YourWwwRoot/.default
    ServerName all-sites
    ErrorLog logs/all-sites-error_log
    CustomLog logs/all-sites-access_log common
    # 下面兩行實現動態解析
    RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
    RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]
    # 沒有解析到的情況下扔到自己的一個PHP中做一下處理
    RewriteRule ^.*$ /index.php [L]
</VirtualHost>

把YourWwwRoot換成你自己的路徑,注意這裡的ServerName沒有讓它起作用,關建看這兩行:
RewriteCond /YourWwwRoot/%{SERVER_NAME} -d
RewriteRule ^/(.*)$ /YourWwwRoot/%{SERVER_NAME}/$1 [L]

第一行是一個rewrite條件,這裡的條件是:如果存在路徑/YourWwwRoot/%{SERVER_NAME},%{SERVER_NAME}就是你訪問站點的域名,-d就表示存在這個路徑的意思(如果是檔案則是-f);
第二行是一個rewrite規則,這個規則執行的前提是:符合規則的正則表示式匹配;符合它前面(也就是剛才說的第一行)rewrite條件。這裡面是的匹配的是.*,也就是所有了,也就是說只要第一行的條件成立,它就會被重寫到/YourWwwRoot/%{SERVER_NAME}/$1,% {SERVER_NAME}是站點的域名,$1則是匹配到的.*。

OK,現在就很清楚了,假設現在有www.domain.com指向到這個伺服器,當你訪問它時(這裡假設沒有在其他VirtualHost解析這個域名),看看它是如何工作的:
首先它在沒有找到匹配的解析時,就來到了這組預設的VirtualHost;
判斷 /YourWwwRoot/www.domain.com 是否存在;
如果存在,重定向到 /YourWwwRoot/www.domain.com。

假設你訪問 http://www.domain.com/test.html,就會重定向到系統的 /YourWwwRoot/www.domain.com/test.html。

那也就是說你在 YourWwwRoot 下建一個與域名同名的目錄(並具備apache訪問的許可權),就實現了這個域名的解析。

說起來似乎有點難懂,其實很簡單的。
這是一個對任意域名的動態解析,哪天有空再寫一下對同一域名下二級域名的解析,其實對這個略做改動就可以了。

/--------------

我的域名是在www.3322.org申請的二級域名wl.7766.org,在www.3322.org那裡對wl.7766.org打開了“萬用字元(*)支援”的選項,也就是域名泛解析的支援,所有的 *.wl.7766.org 都指向wl.7766.org。

現在我把httpd.conf內容改為如下,使用者空間的個人域名開通了。

  1. NameVirtualHost 192.168.1.207
  2. <VirtualHost 192.168.1.207>
  3.     ServerName wl.7766.org
  4.     DocumentRoot /var/www/htdocs #網站根目錄
  5. </VirtualHost>
  6. <VirtualHost 192.168.1.207>
  7.         DocumentRoot /var/www/htdocs/xspace #X-space的目錄
  8.         ServerName blog.wl.7766.org # X-space部落格的域名
  9.         ServerAlias *.blog.wl.7766.org # 開通泛解析
  10. </VirtualHost>
複製程式碼


使用者可以用username.blog.wl.7766.org這樣的域名訪問自己的空間(有點長,哈)。

只是有一個小問題,當用blog.wl.7766.org進入X-space頁面,在X-space的首頁右邊快速登入處登入,登入成功後身份仍是Guest,如果用wl.7766.org/xspace訪問,則一切正常,大概是cookies的問題。
如果是在頂部導航欄的“使用者登入”處登入,那麼不論用什麼域名,登入也一切正常,因為這個地方的連結總是http://wl.7766.org/xspace/index.php/action/login