Apache-2.2

Apache 重定向域和所有子域

  • January 12, 2013

我有一個 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 重定向,並沒有考慮到網路伺服器是否使用了備用埠。您可能需要進一步調整它以滿足特殊需求,但這是一個起點。

引用自:https://serverfault.com/questions/466346