每當特定的 CDN 快取我們的影像時,我都想保留影像檔案名的日志,但我無法完全理解。現在,我的代碼看起來像:
RewriteCond %{HTTP_USER_AGENT} Photon/1.0
RewriteRule ^(.*)$ log.php?image=$1 [L]
上面總是將影像記錄為“log.php”,即使我正在制作 cdn 快取“example.jpg”,我完全不明白為什么。
uj5u.com熱心網友回復:
上面總是將影像記錄為“log.php”,即使我正在制作 cdn 快取“example.jpg”,我完全不明白為什么。
因為在.htaccess重寫引擎中回圈直到 URL 不變地通過(盡管存在L標志)并且您的規則也匹配log.php(您的規則匹配所有內容) - 所以這是最終記錄的“影像”。該L標志只是停止當前通過重寫引擎的傳遞。
例如:
- 要求
/example.jpg - 請求被重寫為
log.php?image=example.jpg - 重寫引擎重新開始,傳遞
/log.php?image=example.jpg到第二遍的開始。 - 請求被
log.php?image=log.php相同的RewriteRule指令重寫。 - 重寫引擎重新開始,傳遞
/log.php?image=log.php到第三遍的開始。 - 請求被重寫為
log.php?image=log.php(再次)。 - URL 在最后一次傳遞中沒有改變 - 處理停止。
你需要做一個例外,這樣它log.php本身就不會被處理。或者,國家所有的非.php處理的檔案(而不是一切)。或者,如果只處理影像,則僅檢查影像。
例如:
# Log images only
RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
RewriteRule ^(. \.(?:png|jpg|webp|gif))$ log.php?image=$1 [L]
請記住在正則運算式中反斜杠轉義文字點。
或者,
# Log Everything except log.php itself
RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
RewriteCond %{REQUEST_URI} ^/(. )
RewriteRule !^log\.php$ log.php?image=%1 [L]
在最后一個示例中,%1指的是前面CondPattern 中捕獲的子模式。我只是這樣做了,而不是REQUEST_URI直接使用,因為您在原始日志記錄指令中排除了斜杠前綴(即image.jpg,您在/image.jpg請求時傳遞給腳本)。如果您還想記錄斜杠前綴,那么您可以省略第二個條件并REQUEST_URI直接通過。例如:
# Log Everything except log.php itself (include slash prefix)
RewriteCond %{HTTP_USER_AGENT} Photon/1.0
RewriteRule !^log\.php$ log.php?image=%{REQUEST_URI} [L]
或者,在 Apache 2.4 上,您可以使用該END標志而不是L強制重寫引擎停止并防止進一步通過重寫引擎。例如:
RewriteCond %{HTTP_USER_AGENT} Photon/1\.0
RewriteRule (. ) log.php?image=$1 [END]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317891.html
