Dot-Htaccess

htaccess 重寫沒有子域的國家

  • July 25, 2019

我需要從

us.example.com

example.com?country=us

沒有子域

我嘗試了這兩條規則:

RewriteRule (US|EG) ?c=$1 [NC , L]
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

但他們沒有工作。

所以..有什麼辦法可以做到這一點?

您不能跨不同的主機名“重寫” URL(您需要實現反向代理),我認為“重定向”是不可取的。

但是,如果子域和主域都指向文件系統的同一區域,則無需更改主機名/域。只需進行一次普通的重寫(在同一主機上)即可。

要檢查請求主機上的子域,您需要一個條件(RewriteCond指令)來檢查HTTP_HOST伺服器變數(即HostHTTP 請求標頭的值)。該RewriteRule 模式僅與 URL 的 URL 路徑部分匹配。

例如:

RewriteEngine On

RewriteCond %{QUERY_STRING} !^country=
RewriteCond %{HTTP_HOST} ^(us|eg)\.example\.com [NC]
RewriteRule ^ /?country=%1 [L]

如上所述,這假設子域和主域指向文件系統的同一區域。這在所有請求都由單個 CMS 管理的系統上很常見。(並且您沒有嘗試更改範例指令中的主機名。)

反向引用包含來自請求的主機名的%1子域(在本例中為“us”或“eg”)。

檢查查詢字元串是否缺少country=URL 參數的附加條件是防止重寫循環。

但是,您沒有說明任何有關 URL 路徑的內容嗎?您應該直接重寫處理請求的文件(index.php?)。在其目前狀態下,上述“重寫”依賴於 mod_dir 為 DirectoryIndex 發出額外的子請求。


  1. RewriteRule (US|EG) ?c=$1 [NC , L]
  2. RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]

這些指令有很多錯誤:

  • 您說您已經嘗試過這些,但是,flags參數中的錯誤**空格將在第一次解析文件時立即導致 500 Internal Server Error。
  • 如上所述,RewriteRule 模式(第一個參數)僅與 URL 路徑匹配。這不包括主機名。
  • #1 中的正則表達式太籠統了,可以在任何地方匹配“US”或“EG” 。
  • 為了匹配絕對 URL(正如您在第二個範例中嘗試做的那樣),您需要匹配THE_REQUEST伺服器變數(其中包含請求標頭的第一行,包括 request method)。

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