Dot-Htaccess

htaccess 僅重寫 .tld 之後的部分

  • July 16, 2019

我有以下 htaccess 規則可以滿足我的要求:它將任何請求重寫為 index.php。但是,我可以讓它獨立於https://subsub.sub零件嗎?

RewriteRule ^(.*)$ https://subsub.sub.domain.example/index.php [L]  

我想要類似的東西

RewriteRule ^(.*\.domain\.example)$ $1/index.php [L] 

甚至類似:

RewriteRule ^(.*)$ "%{HTTP_HOST}/index.php" [L]

(編輯:我期望HTTP_HOST的地方https://subsub.sub.domain.example

但是,這不起作用。這兩個想法都會導致 500 個錯誤。

編輯:Apache錯誤日誌:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

但是,我無法在 htaccess 文件中設置 LogLevel。如何以有效的方式在共享主機上調試它?

RewriteRule ^(.*)$ https://subsub.sub.domain.example/index.php [L]

正如您所說,這將導致外部 302(臨時)重定向,而不是“重寫”。由於替換中的絕對 URL(方案 + 主機名),會發生隱含重定向。

但是,這本身似乎會導致重定向循環1,所以大概您有一些先前的條件*(即RewriteCond指令)來防止這種情況發生?

(*1除非您要重定向到完全不同的文件系統?儘管您的問題中沒有建議這樣做。)

RewriteRule ^(.*\.domain\.example)$ $1/index.php [L] 

您無法將主機名與RewriteRule 模式匹配。該RewriteRule 模式僅匹配 URL 路徑。要匹配請求的主機名,您需要一個RewriteCond檢查HTTP_HOST伺服器變數的指令。

RewriteRule ^(.*)$ "%{HTTP_HOST}/index.php" [L]

HTTP_HOSTserver 變數僅包含主機名(即HostHTTP 請求標頭的值,因此是 name )HTTP_HOST。換句話說,HTTP_HOST將包含subsub.sub.domain.example在您的範例中。因此,您的指令缺少https://您需要手動為替換字元串添加前綴的方案,例如。"https://%{HTTP_HOST}/index.php". 如果沒有scheme,它將被視為一個相對 URL,如果沒有R( redirect) 標誌,則會觸發“內部重定向”(也稱為“重寫”)——因此會報告錯誤。

要在請求表單的主機名(任何子域在哪裡)時將所有請求從外部重定向/index.php到同一主機/域,那麼您需要執行以下操作:*.domain.example``*

RewriteCond %{HTTP_HOST} \.domain\.example$ [NC]
RewriteRule ^ /index.php [R,L]

如果您只是想在請求中重定向到相同的主機名,則根本不需要在替換中指定主機名。(這是假設UseCanonicalName On未在伺服器配置中設置 - 這不是預設設置。)

不需要擷取/詳細的^(.*)$正則表達式,效率較低。您只是匹配所有內容,而不是在替換中使用它。或者使用類似的模式.?來匹配任何東西

正如我在回答開頭提到的那樣,這確實假設您已經有其他阻止重定向循環的條件。

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