2012-02-23 162 views
1

有一個關於使用mod_rewrite重定向特定子域以使用另一個域的問題。我正在尋找儘可能最短的方法來做到這一點,而無需爲我的每個域名創建單獨的重寫規則。我將添加許多新的域名(總共大約20-30個域名)。將多個子域重定向到另一個域名

所以我們假設我的主域名是example.com,並且我希望使用該域名來處理所有事情。因此,如果使用我的其他域中的任何一個,它們將自動重定向到主域,從而保留子域前綴和URL路徑。

實施例:
test.example.org => test.example.com
test2.example.co.uk => test2.example.com
test3.example.net/hello/world。 PHP => test3.example.com/hello/world.php

RewriteEngine on 
RewriteCond %{HTTP_HOST} ^(.*)\.([a-zA-Z]+)\.(.*)$ [NC] 
RewriteRule ^(.*)$ http://%1\.example.com/$1 [R=301,L] 

我不確定如果上面將正確,或者如果它是正確的語法工作。但基本上,我希望它與子域前綴匹配,然後匹配任何域名和任何TLD(.org,.info,.biz,.co.uk,.net等)。我會假設它需要首先確保它不是正確的主域(example.com),以防止無限重定向循環。

此外,是否有可能檢查HTTPS是否打開或關閉並正確設置重定向?如果沒有,我總是可以將HTTPS設置爲ON。

對不起,這個混淆,雖然我想確保我第一次得到這個權利,而不需要編程每個域到.htaccess。

謝謝! :)

回答

2

(。*)是貪婪的,所以你不想使用它,我假設你不想重新創建一個無限循環。

RewriteEngine on 

RewriteCond %{HTTPS}s ^..(s?) 
RewriteRule ^   -        [E=PROTO:http%1]    

RewriteCond %{HTTP_HOST} !^\w+\.example\.com$    [NC] 
RewriteCond %{HTTP_HOST} ^(\w+)\.\w+\..+     [NC] 
RewriteRule ^/?(.*)  %{ENV:PROTO}://%1.example.com/$1 [R=301,L] 

+0

使用這個例子,它的工作。我只需要做一些進一步的測試,以確保它能夠按照需要正確工作。感謝您的詳細回覆! – 2012-02-23 18:08:43

+0

你知道第一個規則是如何工作的嗎?字符串是ons還是offs,所以在%1 =「s」或者「」上得到'^ ..(s?)'結果,因此env變量PROTO得到了正確設置。 Cond2A防止'* .example.com'上的循環和cond2B文件上的子域。 Rule2B把它放在一起。如果它能夠工作,那麼這個刻度線會很好:-) – TerryE 2012-02-23 18:14:19

+0

它完美的工作,我理解這個概念。我遇到的一個問題是,有人去過example.org,直到他們導航纔會停留在example.org。我嘗試了其他技巧,但是我無法將它改爲主要的「example.com」。 – 2012-02-23 18:43:03

1

這條規則將無法工作,因爲它會與example.com結束的任何主機重定向到example.com,你會得到一個重定向循環。您需要更改正則表達式看起來像這樣,到末與.com匹配任何:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.?([a-zA-Z]+)\.(?:(?!com).)*$ [NC] 
+0

你已經明確了我的混亂!唯一的問題是,我可能有其他域名也有「.com」。 – 2012-02-23 18:07:28

相關問題