為重寫請求設置記憶體策略
我有一個
RewriteRule
將包含版本控制部分的文件的任何請求重寫為沒有版本的文件:RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L]
這意味著無論何時
styles.<version-id>.css
請求該文件,它都會被重寫為styles.css
. 現在,如果請求文件的版本化版本,如何設置記憶體標頭以便將文件記憶體更長的時間?換句話說,如果文件
styles.css
被重新請求,它應該被記憶體 24 小時,而文件styles.<version-id>.css
應該被記憶體 365 天。我嘗試
FilesMatch
使用此程式碼段在重寫之前和之後設置記憶體:<FilesMatch ".+\.[0-9a-f]{32}\.[0-9a-z]{2,6}"> Header set Cache-Control "max-age=31536000, public" </FilesMatch>
但它不起作用。也許它不匹配,因為文件名被重寫。我不知道。
我也嘗試過使用環境變數:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion] Header set Cache-Control "max-age=31536000, public" env=AutoVersion
但我也不能讓它工作。
有沒有辦法根據原始請求設置重寫請求的記憶體策略?
<FilesMatch>
匹配物理文件(而不是 URL),因此這永遠不會匹配形式的URLstyles.<version-id>.css
,其中物理文件是styles.css
.
<LocationMatch>
(在伺服器配置中)是 URL 的等價物,但是您正在重寫 URL 並且<Location[Match]>
包裝器應用較晚,因此,這將永遠不會匹配。(基於這些指令的格式和行為,我假設這些指令在目錄/
.htaccess
上下文中,而不是直接在伺服器配置/虛擬主機中?)RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.+)\.[0-9a-f]{32}(\.[0-9a-z]{2,6})$ $1$2 [L,E=AutoVersion] Header set Cache-Control "max-age=31536000, public" env=AutoVersion
但是你可以在 mod_rewrite 的幫助下設置一個環境變數——就像你所做的那樣。如果直接在伺服器配置中使用,這將幾乎可以正常工作。(除非
REQUEST_FILENAME
需要更改為LA-U:REQUEST_FILENAME
按預期執行,否則RewriteCond
指令將始終評估為真。)但是,在每個目錄的上下文中,重寫過程在初始重寫後重新開始,並且環境變數得到前綴
REDIRECT_
(不保留原始環境變數)。因此,您只需要更改Header
指令來檢查這個重命名的環境變數。例如:Header set Cache-Control "max-age=31536000, public" env=REDIRECT_AutoVersion