htaccess 重寫沒有子網域的國家/地區

htaccess 重寫沒有子網域的國家/地區

我需要重寫 URL

us.example.com

example.com?country=us

沒有子域

我嘗試了這兩條規則:

1.

RewriteRule (US|EG) ?c=$1 [NC , L]

2.

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

但他們沒有工作。

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

答案1

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

但是,如果子網域和主域都指向檔案系統的相同區域,則無需變更主機名稱/網域。只需要進行普通重寫(在同一台主機上)即可。

若要檢查請求主機上的子網域,您需要一個條件(RewriteCond指令)來檢查HTTP_HOST伺服器變數(即 HTTP 請求標頭的值Host)。這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]

這些指令存在許多錯誤:

  • 你說你已經嘗試過這些,然而,錯誤的空間在裡面旗幟首次解析檔案時,參數將立即導致 500 內部伺服器錯誤。
  • 如上所述,RewriteRule 圖案(第一個參數)僅與 URL 路徑相符。這不包括主機名稱。
  • #1 中的正規表示式太籠統,符合“US”或“EG”任何地方
  • 為了匹配絕對 URL(正如您在第二個範例中嘗試執行的那樣),您需要匹配THE_REQUEST伺服器變數(其中包含請求標頭的第一行,包括請求方法)。

相關內容