簡體   English   中英

里面的 Cache-Control 標頭<if>和<else> htaccess 文件中的條件被忽略</else></if>

[英]Cache-Control headers inside <If> and <Else> conditionals are being ignored in htaccess file

幾天來我一直在嘗試解決這個問題,並最終制作了一個足夠簡化的測試環境,以便我可以通過幾個示例發布這個問題。

我遇到的問題是我的 htaccess 文件同時忽略了<If><Else>條件。 我正在使用 Apache 版本 2.4.29,它確實支持此功能。 同樣,當我保存 htaccess 文件時,我沒有收到 500 級錯誤——該站點運行良好(除了這些被忽略)。

我的用例是我想監聽一個查詢參數並根據該查詢參數是否存在來更改 Cache-Control header。 我相信其他人會不同意這個前提,雖然我很好奇更好的解決方案是什么,但我想深入了解這個特定問題。

我已經嘗試向<If>提供幾個條件,認為它可能只是不喜歡這種格式或者我在那里做錯了什么,但我現在已經將它簡化為簡單的<If false>試圖強制條件的<Else>側。 無論我做什么,條件的任何一方都不起作用——它被完全忽略了。

難道我做錯了什么? 我相信我的語法與文檔相匹配,但也許我遺漏了一些東西......雖然我確實有很多編寫 .htaccess 文件的經驗,但我承認我與 Apache 專家相去甚遠。

測試用例

我制作了一個網頁,只加載了一個image.png文件,並在 Chrome DevTools 中讀取了 Cache-Control header。


示例 A

.htaccess文件內容:

<FilesMatch "png">
    Header set Cache-Control "max-age=123, public"
</FilesMatch>

<If false>
    <FilesMatch "png">
        Header unset Cache-Control
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    </FilesMatch>
</If>
<Else>
    <FilesMatch "png">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
</Else>

預期: Cache-Control max-age應為31536000

實際: Cache-Control max-age123

最大年齡為 123


示例 B

.htaccess文件內容:

<If false>
    <FilesMatch "png">
        Header unset Cache-Control
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
    </FilesMatch>
</If>
<Else>
    <FilesMatch "png">
        Header set Cache-Control "max-age=31536000, public"
    </FilesMatch>
</Else>

預期: Cache-Control max-age應為31536000

實際:根本不存在Cache-Control header

根本沒有緩存控制標頭


編輯:出現了一條線索,表明我可以在 If/Else 條件中使用 301 RedirectMatch,因此緩存控制標頭似乎是在條件中被忽略的內容...如果是這種情況,我好奇我必須使用哪些其他選項才能使我的用例(如上所述)工作。

編輯 2:另一個線索是,如果沒有<FilesMatch>行,Cache-Control max-age header 按預期應用(只是不適用於正確的文件)。

因此,我為我的特定用例找到了一種解決方法,這就是為什么我“回答”我自己的問題,但我不“接受”這個答案,因為它不能解決核心問題。 我想為將來偶然發現此問題的任何人提供此功能。

我發現<FilesMatch>是在<If><Else>條件中被忽略的內容。 可以在其中設置重定向和標頭而不會出現問題。

所以對於我的用例,我翻轉了邏輯。 我使用<FilesMatch> (在任何條件之外)為單個文件類型設置了常規緩存長度。 然后,我添加了一個<If>條件來檢查查詢字符串,如果為真,它將取消設置所有 Cache-Control 標頭(因此對於所有文件都沒有 FilesMatch)。

這是我現在為解決方法所做的一個示例(格式與上述示例相同):

# Set the cache headers as desired for individual files
<FilesMatch "png">
    Header set Cache-Control "max-age=123, public"
</FilesMatch>

# When this condition is true unset all of the caches (to be replaced with a query string detection)
<If true>
    # Notice no FilesMatch here– it affects all files
    Header unset Cache-Control
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
</If>

同樣,這實際上並沒有回答核心問題,所以我不會“接受”我自己的答案,但我想為其他人提供它。

您可以將if/else用於.png文件,如下所示:

<FilesMatch "\.png$">
   <If false>
        Header unset Cache-Control
        Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
   </If>
   <Else>
        Header set Cache-Control "max-age=31536000, public"
   </Else>
</FilesMatch>

預計它將為所有.png文件設置Cache-Control: max-age=31536000, public

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM