htaccess 僅重寫 .tld 之後的部分
我有以下 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_HOST
server 變數僅包含主機名(即Host
HTTP 請求標頭的值,因此是 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
未在伺服器配置中設置 - 這不是預設設置。)不需要擷取/詳細的
^(.*)$
正則表達式,效率較低。您只是匹配所有內容,而不是在替換中使用它。或者使用類似的模式.?
來匹配任何東西。正如我在回答開頭提到的那樣,這確實假設您已經有其他阻止重定向循環的條件。