2009-07-31 473 views
2

我不想讓人們能夠在我的網站中註冊他們自己的部分,並讓這些部分成爲我的網站的子域。所以有人可以註冊'測試',並有'test.example.com'參考他們的網站,這將是說/ site.php?id = 1那麼我怎麼會去寫一個mod_rewrite規則呢?對子域名使用mod_rewrite

回答

2

mod_rewrite可能不是最好的工具。 RewriteRules非常適合將文件映射到其他內容,但它並非真正意義上的域匹配。

您可以使用mod_rewrite做的最好的是:

RewriteEngine On 
# Skip www.domain.com 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com 
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L] 

這是不是真的有用。我會建議做的,而是如果以編程方式檢查這樣的HTTP_HOST值:

function get_subdomain() { 
    if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches)) 
    return $matches[1]; 
} 
0

您可以配置Apache要求在Apache配置中的「特殊」的領域(如www.mydomain.com等),在您的虛擬主機容器中,並讓其他人默認訪問您的第一個虛擬主機。然後,您可以將基礎URL重寫爲調度應用程序,該應用程序將檢查URL並將用戶發送到正確的區域。

從Apache 2.0的文檔:

幾乎所有的Apache命令都可以 進入虛擬主機容器。 第一個VirtualHost部分用於 沒有已知服務器名稱的請求。

把代碼來處理* .mydomain.com來在第一虛擬主機:

<VirtualHost *:80> 
    Servername custom.mydomain.com 
    DocumentRoot /var/www/html/custom 
    RewriteEngine on 
    RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R] 
    # more configs here 
</VirtualHost> 

<VirtualHost *:80> 
    Servername www.mydomain.com 
    DocumentRoot /var/www/html/homepage 
    # more configs here 
</VirtualHost> 

在dispatch.cgi,檢查URL呼叫,以確定用戶應該去。確保你設置你的DNS接受所有子域名。

希望有幫助!

0

實際上,我們一直在使用這種技術,在過去的一年中沒有太多問題。我們mod_rewrite的配置是這樣的:

RewriteEngine On 
RewriteBase/
RewriteCond %{HTTP_HOST} !www.mydomain.com 
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com 
RewriteCond %{REQUEST_URI} !admin 
RewriteRule (.*) /admin/ [R=301,L] 
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L] 

會發生什麼事,就是將用戶定向到theiraccount.mydomain.com/admin。

然後我們使用PHP來識別域名的帳戶部分。使用諸如$ _SERVER ['SERVER_NAME']之類的東西或者一些獲取域名和分析它的方法非常有效。

儘管將這些配置保存在httpd.conf中,但如果保存爲.htaccess,這將成爲高流量站點中的cpu問題。