Apache-2.4

除非資源存在,否則重寫

  • March 14, 2018

我有以下重寫規則,它轉換example.com/anything/為載入頁面example.com/anything.html

RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]

當物理目錄或文件存在時,我需要此規則的例外。例如,如果有一個物理目錄,example.com/test/那麼它應該從該目錄載入一個索引/test/,而不是將其重寫為example.com/test.html

我相信我需要重寫條件並RewriteCond類似於:!-d``!-f

https://httpd.apache.org/docs/2.4/rewrite/remapping.html#fallback-resource

我無法弄清楚如何編寫這些條件。

解決方案:

前綴條件:

RewriteCond %{REQUEST_FILENAME} !-d

允許像通常那樣讀取目錄。此外,我的正則表達式模式匹配不考慮帶有副檔名的文件名(缺少 dot ),因此也將照常讀取.諸如此類的文件。example.css

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]

是的,正如你所建議的,你需要一個額外的條件來測試它不是一個目錄。例如,在.htaccess

RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([A-Za-z0-9-]+)/?$ $1.html [L]

否定的CondPattern !-d檢查REQUEST_FILENAME沒有映射到目錄。REQUEST_FILENAME變數(在目錄上下文.htaccess中)保存請求映射到的文件/目錄的絕對文件系統路徑。

我認為您不需要檢查文件,因為文件不應該與RewriteRule 模式 ^([A-Za-z0-9-]+)/?$匹配- 除非您有沒有文件副檔名的文件?


Apache 文件中,您連結到:

RewriteCond "/var/www/my_blog/%{REQUEST_FILENAME}" !-d

考慮到範例顯示它在目錄上下文中使用,該指令的格式實際上對我來說並不正確。(在伺服器虛擬主機上下文中可能需要此格式,當REQUEST_FILENAMEREQUEST_URI- 請求的 URL 路徑相同時。但是,此變數隨後將以斜杠 開頭,因此上述內容仍然不正確?!)

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