apache rewrite and VirtualDocumentRoot

參考資源:http://phorum.study-area.org/index.php?topic=17120.0

設定讓每個使用者可以自動對應到某個虛擬伺服器的方式


UseCanonicalName On

VirtualDocumentRoot /home/%1/www/%2

例如

http://mlwmlw.blog.mlwmlw.org/ 對應至 /home/mlwmlw/www/blog

ohmygod.test.mlwmlw.org/ 對應至 /home/ohmygod/www/test

%1 %2 %3 則是按照 dns 名稱的順序對照到實體目錄上

.htaccess rewrite

透過 rewrite 設定將某個網址導到某個資料夾下的 index.php  ,常用於 codeIgniter 的設定,

官方教學的方式如下,感覺只能處理網址是虛擬伺服器的情況,

例如上述的 blog.mlwmlw.org/index.php,才能成功,


RewriteEngine On
RewriteCond %{REQUEST_URI} !^(/index\.php|/img|/js|/css|/robots\.txt|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

否則都會導頁到根目錄下,例如我用 http://mlwmlw.org/~user/test/index.php,

他則會幫我弄成 http://mlwmlw.org/index.php =__=。

如果想要將網址http://mlwmlw.org/~user/dir/index.php/xxx/yyy

導至 /home/user/www/dir/index.php/xxx/yyy 下,則可以用以下的 rewrite。

透過 REQUEST_FILENAME 會產生完整的要求目錄的原理,

將他與時紀要求的路徑對應去產生群組 %1 %2 變數來使用接在 RewriteRule 內。

感覺 rewrite 實在有點複雜…甚至還有專書在討論

Definitive-Guide-Apache-mod_rewrite

搞了三四個專案的失敗經驗才成功寫出這個規則…否則以往都要依照使用者設定 virtual host ~

但是最上面的那個設好也是可以不用一一指定啦~

其實有一大堆作法…可以用…博大精深的 httpd configuration…

RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
RewriteRule ^(.*)$ /~%1/%2/index.php/$1 [L]

RewriteRule 對應的正規在比照的是 mlwmlw.org/index.php?abc=123 網址裡面的 /index.php?abc=123
所以如果寫 RewriteRule a http://a.com 則是 index.php?abc=123 裡面有出現 a 這個字就會轉頁,
如果要完整比對整個字串應該是要加上 ^a$ 來指定從開頭對照到結尾

%{REQUEST_FILENAME} 看到的是完整的要路徑 , 例如 /home/mlwmlw/www/project/index.php
%n 代表的是 RewriteCond 正規裡面符合條件的群組順序,例如上面的

RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)

對照到 /home/mlwmlw/www/project/index.php 的 /home/(%1)/www/(%2)/index.php 這樣 %1 , %2 就能在 Rule 裡面又拿來當規則,

$n 代表的是 RewriteRule 前半段的正規符合的群組,例如

http://mlwmlw.org/~mlwmlw/project/hello/world 會提取出 /hello/world 來比較,^(.*)$ 則是把整段都拿來 對應到 $1,

就是把參數都往 /~mlwmlw/project/index.php/$1 <- 這裡丟 變成 /~mlwmlw/project/index.php/hello/world

另外一提這裡比較特別與奇怪的用法是一開始的
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
由於這裡根本還沒用到 RewriteRule 所以 $1 指的意思好像比較不明,
好像比較少這樣用,但是一樣是指 /hello/world 這一段,
如果有這段是採用 /index.php or /assets .. 等規則開始的話就直接跳掉了。
另外加上一個更完整的情境…與 RewriteCond and 的用法

RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
RewriteCond %{HTTP_HOST} ^.+\.site\.com$
RewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
RewriteRule ^(.*)$ /%2/index.php/$1 [L]

RewriteCond $1 !^(index.php|images|robots.txt|assets|temp)
rewriteCond %{REQUEST_FILENAME} ^/home/(.+)/www/(.+)/(.*)
rewriteRule ^(.*)$ /~%1/%2/index.php/$1 [L]
  
if [^index.php,^images,^robots.txt,^temp] in url and host reg *.site.com :   
  (%1, %2, %3) = filename reg /home/(*)/www/(*)/(*) 
  $1 = url 
  redirect /%2/index.php/$1 
else if [^index.php,^images,^robots.txt,^temp] in url : 
  (%1, %2, %3) = filename reg /home/(*)/www/(*)/(*) 
  $1 = url   redirect /~%1/%2/index.php/$1

網站在 /home/mlwmlw/www/apple/ 設定好網址,
可以用 http://mlwmlw.site.com/apple 進去
也可以用 http://site.com/~mlwmlw/apple 進去

DNS Server

http://4271569.spaces.live.com/blog/cns!F1EA4F91324DA556!756.entry
CentOS v5.3-安裝 bind(DNS) / 新增網域名稱 / 每次開機就啟動 named
**Bind 的相關套件 ( DNS )
 .bind…………………………DNS 主程式
 .bind-chroot………………將 bind 主程式關在家理
 .bind-utils………………….用戶搜詢主機名稱的相關指令
 .system-config-bind
 .caching-nameserver

**安裝 bind,似 DNS 名稱解悉
**bind 的設定檔在 /var/named/chroot
# yum -y install bind bind-chroot bind-utlis system-config-bind caching-nameserver <-- 安裝套件。install 時不需再問全為 (y)es # cd /var/named/chroot/etc <-- 切換至 etc 目錄下 # cp named.caching-nameserver.conf named.conf <-- 覆製 named.caching-nameserver.conf,另存成 named.conf # ll <-- 觀察 named.conf 檔案權限, 此時應為 root root # chown root:named named.conf <-- 變更 named.conf 檔案權限 # ll <-- 觀察 named.conf 檔案權限, 此時應變稱為 root named # service named restart <-- 修改後需重新啟動,讓設定值生效。會先關畢,然後再啟動 # vi /var/named/chroot/etc/named.conf <-- 修改 named.conf 將 listen-on port 53 { 127.0.0.1; }; 修改成 listen-on port 53 { any; }; <-- 將127.0.0.1 改為 any,表示監聽所有 53 port 介面 將 allow-query { localhost; }; 修改成 allow-query { any; }; <-- 將 localhost 改為 any,表示允許外部來此台 dns 查詢 # service named restart <-- 修改後需重新啟動,讓設定值生效。會先關畢,然後再啟動 **新增 網域名稱 ◎假設網域名稱 ne160.kirnel.com  .新增加網域名稱 hello.ne160.kirnel.com  .新增加網域名稱 kitty.ne160.kirnel.com       ne160.kirnel.com ( 140.137.217.160 )           /       \          /         \         hello        kitty      ne160.kirnel.com  ne160.kirnel.com      140.137.217.160  140.137.217.160          |        | ┌-------- ┼- Apache -┼-------┐ | /opt/hello <┘        └> /opt/kitty | └-------------------------┘ # vi /var/named/chroot/etc/named.conf <-- 修改 etc 目錄下的 named.conf 檔 將 match-client { localhost; }; 修改成 match-client { any; }; 將 match-destinations { localhost; }; 修改成 match-destinations { any; }; # vi /var/named/chroot/etc/named.rfc1912.zones <-- 修改 named.rfc1912.zones 檔案 增加以下: zone "ne160.kirnel.com" IN { type master; file "ne160.zone"; allow-update { none; }; }; # cd /var/named/chroot/var/named # ll <-- 觀察是否有 ne160.zone # cp localhost.zone ne160.zone <-- 覆製 localhost.zone,另存成 ne160.zone # ll <-- 觀察 ne160.zone 檔案權限,此時應為 root root # chown root:named ne160.zone <-- 變更 ne160.zone 檔案權限 # ll <-- 觀察 ne160.zone 檔案權限,此時應變稱為 root named # vi /var/named/chroot/var/named/ne160.zone <-- 修改 ne160.zone,新增加 hello 及 kitty 網域 增加以下: hello  IN A  140.137.217.160 kitty  IN A  140.137.217.160 # service named restart <-- 修改完後,重新啟動 named。會先關畢,然後再啟動 **測試 # vi /etc/resolv.conf <-- 設定 DNS 增加以下: nameserver 168.95.1.1 # dig hello.ne160.kirnel.com @localhost <-- 使用本端機的 DNS,來查 hello.ne160.kirnel.com # dig hello.ne160.kirnel.com @168.95.1.1 <-- 使用中華電信的 DNS,來查 hello.ne160.kirnel.com # dig kitty.ne160.kirnel.com @localhost <-- 使用本端機的 DNS,來查 kitty.ne160.kirnel.com # dig kitty.ne160.kirnel.com @168.95.1.1 <-- 使用中華電信的 DNS,來查 kitty.ne160.kirnel.com **測試在 Windows 下使用 ping 指令  .ping hello.ne160.kirnel.com  .ping kitty.ne160.kirnel.com **建立 hello 及 kitty 網站目錄 # cd /opt <-- 切換至 /opt 目錄下,觀查有無 hello 及 kitty 目錄 # mkdir /opt/hello <-- 在 /opt 目錄下建立 hello 網站目錄 # mkdir /opt/kitty <-- 在 /opt 目錄下建立 kitty 的網站目錄 **建立網站內容文字 # echo "This is hello web." > /opt/hello/index.html <-- 在 hello 目錄下建立 index.html 檔案 # echo "This is kitty web." > /opt/kitty/index.html <-- 在 kitty 目錄下建立 index.html 檔案 **建立虛擬網站 # service httpd restart <-- 重新啟動。會先關畢,然後再啟動 # cd /etc/httpd/conf <-- 切換至 conf 目錄下 # vi httpd.conf 增加以下: NameVirtualHost 140.137.217.160:80
ServerAdmin [email protected]
DocumentRoot /opt/hello
ServerName hello.ne160.kirnel.com
ErrorLog /var/log/hello-error_log
CustomLog /var/log/hello-access_log common


ServerAdmin [email protected]
DocumentRoot /opt/kitty
ServerName kitty.ne160.kirnel.com
ErrorLog /var/log/kitty-error_log
CustomLog /var/log/kitty-access_log common

# service httpd restart <-- 修改後,重新啟動。會先關畢,然後再啟動 **測試網站是否正確建立完成  .在 Windows 下開啟瀏覽器,在網址列內輸入 http://hello.ne160.kirnel.com  .在 Windows 下開啟瀏覽器,在網址列內輸入 http://kitty.ne160.kirnel.com **設定每次開機就啟動 named # chkconfig named on <-- 設定每次開機就啟動 named 功能 http://plus-now.com/?p=31

http://plus-now.com/?p=36

參考上述設定…