我查看了 Google 和 StackOverflow 的 5 頁,但似乎無法找到使用 .htaccess 洗掉域中尾部斜杠的方法。它使用Litespeed。任何人都可以向我提供可以添加到我的檔案中的代碼嗎?我會回復說它是否有效。謝謝!
uj5u.com熱心網友回復:
它們是物理目錄。
您不能“簡單地”從物理檔案系統目錄中洗掉尾部斜杠。我建議不要嘗試這樣做。
這與不映射到物理檔案路徑的任意“虛擬”URL 上的尾部斜杠非常不同。
Apache 需要目錄上的尾部斜杠才能正確提供DirectoryIndex檔案 (mod_dir) 并生成目錄串列 (mod_autoindex)。
默認情況下,mod_dir 通過發出 301(永久)重定向明確地將尾部斜杠附加到目錄(如果省略),該重定向由瀏覽器永久快取。
為了洗掉目錄上的尾部斜杠(或防止它被附加),您需要覆寫此默認行為。但是您必須然后手動附加帶有內部 rewrite的尾部斜杠,以便 URL 按預期作業。
防止 mod_dir 附加斜杠相對簡單:
# Prevent mod_dir from appending trailing slashes to directories
DirectorySlash Off
# Prevent mod_autoindex generating directory listings
Options -Indexes
確保在DirectorySlash Off設定時禁用目錄索引是一項額外的安全措施,因為沒有尾部斜杠,DirectoryIndex檔案的存在不會阻止 mod_autoindex 生成目錄串列并暴露您的檔案結構。
但是,如果沒有請求物理目錄,您現在需要發出內部重寫以“靜默”附加尾部斜杠,例如:
# Append trailing slash on directories with an internal rewrite
RewriteCond $1 !/$
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule (. ) $1/ [L]
實作上述內容后,您應該已經在請求不帶斜杠的 URL/目錄。但是,如果您要更改此行為并且帶有尾隨斜杠的 URL已被搜索引擎編入索引或由第三方鏈接,那么您還需要實施外部重定向以洗掉尾隨斜杠以保留 SEO。為簡單起見,我假設您希望從所有URL(不僅僅是物理目錄)中洗掉尾部斜杠。
例如,在上述重寫之前需要執行以下操作:
# Remove trailing slash if requested directly
# NB: Applies to ALL URLs, including directories
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule (. )/$ /$1 [R=301,L]
為了防止重定向回圈,需要檢查環境變數的條件REDIRECT_STATUS。我們只想重定向來自客戶端的直接請求,而不是稍后重寫的重寫請求。
注意:使用 302(臨時)重定向進行測驗以避免潛在的快取問題。
在測驗之前,您需要清除瀏覽器(和任何中介)快取。
但是,正如我在回答開頭所指出的,除非您有充分的理由這樣做,否則我建議您不要實施此操作,因為您可能會遇到意外沖突。歸根結底,Apache 需要在物理檔案系統目錄上添加斜杠。
在旁邊:
RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ /$1 [L,R=301]
這會從任意 URL 路徑中洗掉尾部斜杠。這是您的“標準”斜線洗掉規則。但是,這不會像您嘗試那樣從物理目錄中洗掉尾部斜杠。有兩個原因:
- 該條件明確檢查請求未映射到物理目錄。
- 在沒有首先設定的情況下從物理目錄中洗掉斜杠
DirectorySlash Off將導致重定向回圈,因為 mod_dir 自然會嘗試再次附加它。
uj5u.com熱心網友回復:
您可以使用以下內容洗掉 URL 上的尾部斜杠.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
對于您的測驗,我建議使用R=302它,因此它不是永久重定向,因為某些瀏覽器會無限期地快取這些內容,而無需清除完整的快取并在生產中使用R=301。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/398113.html
標籤:.htaccess
