
我需要重寫 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 發出額外的子請求。
RewriteRule (US|EG) ?c=$1 [NC , L]
RewriteRule :\/\/(.*?).example.com ?C=$1 [NC , L]
這些指令存在許多錯誤:
- 你說你已經嘗試過這些,然而,錯誤的空間在裡面旗幟首次解析檔案時,參數將立即導致 500 內部伺服器錯誤。
- 如上所述,
RewriteRule
圖案(第一個參數)僅與 URL 路徑相符。這不包括主機名稱。 - #1 中的正規表示式太籠統,符合“US”或“EG”任何地方。
- 為了匹配絕對 URL(正如您在第二個範例中嘗試執行的那樣),您需要匹配
THE_REQUEST
伺服器變數(其中包含請求標頭的第一行,包括請求方法)。