除非資源存在,否則重寫
我有以下重寫規則,它轉換
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_FILENAME
與REQUEST_URI
- 請求的 URL 路徑相同時。但是,此變數隨後將以斜杠 開頭,因此上述內容仍然不正確?!)