Apache-2.2

為重寫請求設置記憶體策略

  • August 21, 2017

我有一個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

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