Dot-Htaccess
htaccess 重寫沒有子域的國家
我需要從
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
伺服器變數(即Host
HTTP 請求標頭的值)。該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]
這些指令有很多錯誤:
- 您說您已經嘗試過這些,但是,flags參數中的錯誤**空格將在第一次解析文件時立即導致 500 Internal Server Error。
- 如上所述,
RewriteRule
模式(第一個參數)僅與 URL 路徑匹配。這不包括主機名。- #1 中的正則表達式太籠統了,可以在任何地方匹配“US”或“EG” 。
- 為了匹配絕對 URL(正如您在第二個範例中嘗試做的那樣),您需要匹配
THE_REQUEST
伺服器變數(其中包含請求標頭的第一行,包括 request method)。