Apache-2.2
Apache 重定向域和所有子域
我有一個 Apache 配置設置,其中有多個虛擬主機作為子域。我剛剛購買了一個新域名,我希望所有對該域名的請求都重定向到新域名,包括子域:
old.com > new.com sub.old.com > sub.new.com
有沒有簡單的方法可以在裡面做到這一點
httpd.conf
?
自從我寫 RewriteRule 以來已經有一段時間了,但這是我對它的破解:
RewriteEngine on RewriteCond %{HTTP_HOST} (.+\.)?old\.com$ [NC] RewriteRule (.*) http://%1new.com$1 [R]
將它放在 old.com 的基於名稱的虛擬主機中。這是思考過程,如果我有點生疏,你可以自己糾正它:
RewriteCond
分解:
RewriteCond
匹配所有傳入主機的前綴“一個或多個字元後跟一個文字點”,後跟 old.com。圓點位於括號內,因為除非提供了子域組件,否則它不會出現。- 反斜杠是為了逃避點的意思。(使它們字面化)
?
指定括號中包含的所有內容都是可選的。(子域組件)- 該
$
字元將正則表達式錨定到字元串的末尾,以防止過早的匹配怪異。- 該
[NC]
標誌強制它不區分大小寫。- 由於虛擬主機將確保每個字元串都包含一個匹配模式,所以這個匹配本身什麼也不做。重要的是括號將擷取傳入主機頭的子域組件,用於即將到來的
RewriteRule
.
RewriteRule
分解:
- 使用 擷取傳入請求的整個 URI
(.*)
。- 向前跳過,該
[R]
標誌指定重定向操作。- 重定向 URL 有兩個替換:
- 第一個是
%1
,它是 擷取的第一個字元串RewriteCond
。在這種情況下,它應該是域後綴。new.com 之前缺少前綴點很重要:可能沒有子域組件,在這種情況下不應該有點。該點應該作為 RewriteCond 正則表達式的一部分被擷取。
- 第二個是
$1
,它與 擷取的第一個字元串匹配RewriteRule
。這應該是使用者嘗試在子域下訪問的 URI。如果有人指出了一個避免使用 RewriteRule 的解決方案,請向他們致敬:您應該盡可能將其作為您的解決方案。
mod_rewrite
當您缺乏專用配置指令提供的更優雅的解決方案時。我還應該注意,這個例子只會做非 HTTPS 重定向,並沒有考慮到網路伺服器是否使用了備用埠。您可能需要進一步調整它以滿足特殊需求,但這是一個起點。