我對 Apache 2.4 上的內部 mod_rewrte 重定向有一個奇怪的問題。
在我的.htaccess檔案中,我將子域重定向到具有以下指令sub的檔案夾:/sub
RewriteCond %{HTTP_HOST} ^sub.mydomain.com$ [NC]
RewriteRule ^((?!sub).*)$ /sub/$1 [NC]
Thos 非常適用于,例如https://sub.mydomain.com/articles/- URL 在瀏覽器的地址欄位中保持這樣,并且正如預期的那樣,來自位置的資料/sub/articles/index.html被提供/
但是,當我在瀏覽器中輸入時https://sub.mydomain.com/articles(注意缺少的斜杠),瀏覽器中的 URL 會更改為https://sub.mydomain.com/sub/articles/(注意復制sub為檔案夾和子域!)。
我猜這是由 Apache 的默認行為引起的,即在無斜杠目錄請求中添加斜杠作為外部重定向。添加斜線對我來說是可以的,但我當然想避免檔案夾子域重復。- 我怎樣才能做到這一點?
uj5u.com熱心網友回復:
是的,這是由于 mod_dir 在發生重寫后向目錄附加斜杠(帶有 301 重定向)引起的,從而暴露了內部重寫的 URL/目錄。
因此,規范 URL 必須是/articles/(帶有斜杠),而不是/articles. 我們可以在重寫發生之前通過外部重定向來糾正這個問題。
(這避免了您必須禁用DirectorySlash- 這仍然會給您留下規范化/重復內容問題。)
例如,在現有重寫之前,測驗以查看請求的 URL 路徑(缺少尾部斜杠)是否作為目錄存在于目錄中,/sub如果是,則附加斜杠。
# Redirect to append trailing slash if exists as a dir inside "/sub"
RewriteCond %{HTTP_HOST} ^sub\.mydomain\.com [NC]
RewriteCond %{DOCUMENT_ROOT}/sub/$1 -d
RewriteRule ^((?!sub/).*[^/])$ /$1/ [R=301,L]
作為額外的優化,您可以通過排除看起來像具有檔案擴展名的 URL,來避免對靜態資產(自然不會以斜杠結尾)執行不必要的檔案系統檢查(相對昂貴)。(這假設您沒有具有檔案擴展名的物理目錄,例如。/sub/somedir.xyz)
在上述規則中添加以下內容作為第二個條件(在檔案系統檢查之前):
RewriteCond %{REQUEST_URI} !\.\w{2,4}$
在旁邊:
RewriteCond %{HTTP_HOST} ^sub.mydomain.com$ [NC] RewriteRule ^((?!sub).*)$ /sub/$1 [NC]
您可能應該在此指令上使用L標志。RewriteRule(并且NC標志應該是不必要的。)
正則運算式^((?!sub).*)$排除任何簡單的 URL 路徑,sub包括/subfoo和/subbar等(這自然會阻止這些目錄在/sub目錄中可訪問)。任何有效的請求都將開始/sub/(帶有斜杠),因此應該包含在否定前瞻中,就像我在上面的規則中所做的那樣。
如果還沒有,/sub/如果應該公開/發現此目錄,還考慮重定向以從直接請求中洗掉。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/456037.html
上一篇:對于特定的url'www.example.com/mobile'我希望url重寫到另一個特定路徑:'root_folder/mobile/index.html'
