假設在根目錄中我有一個檔案(稱為index.php)和一個檔案夾(稱為caches)。我希望如果檔案存在于快取檔案夾中,則為該檔案提供服務(caches/xxx.html),否則請求發送到index.php.
例如,我將向 server: 發送請求,https://example.com/how-to-do
并首先在cache/. 如果how-to-do.html存在則發送(重寫 Apache)how-to-do.html,否則發送請求到index.php.
這是我的.htaccess:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (. )/$
RewriteRule ^ %1 [L,R=301]
# Send Requests To Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
uj5u.com熱心網友回復:
在您的最后一條規則之前(即在# Send Requests To Front Controller...評論之前),您可以添加如下內容:
# Check if cache file exists and serve from cache if it is
RewriteCond %{DOCUMENT_ROOT}/cache/$0.html -f
RewriteRule ^[^/.] $ cache/$0.html [L]
這僅檢查針對檔案根的請求,例如。/how-to-do- 就像你的例子一樣。它還假定您的 URL 路徑不包含點(用于分隔檔案擴展名)。它不針對具有多個路徑段的請求,例如。/foo/bar.
要匹配多個路徑段,只需從正則運算式字符類中洗掉斜線即可。IE。^[^.] $.
該RewriteRule 模式 ^[^/.] $匹配任何不包含字符slash和dot的非空 URL 路徑。換句話說,它匹配由單個路徑段組成的 URL 路徑,不包括檔案(檔案擴展名前自然包含一個點)。在中,模式匹配的.htaccessURL 路徑不以斜杠開頭。RewriteRule
$0RewriteRule 是一個反向參考,包含與模式匹配的整個 URL 路徑(即。^[^/.] $)。
參考
官方的 Apache 檔案應該是您的參考(盡管檔案相當簡潔,并且有些地方缺少示例):
- Apache mod-rewrite 內容
- Apache mod_rewrite 簡介
- Apache mod_rewrite 參考
RewriteRule指示RewriteCond指示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/445397.html
