這是關於應用程式請求路由和動態禁用某些請求的磁碟快取(其中請求來自經過身份驗證的使用者;它們是否經過身份驗證可以由自訂程式碼決定)。
在我的設定中,有一台伺服器運行 ARR,將請求分派到另一台伺服器上的 ASP.NET MVC 網站。該網站使用表單驗證(有時是 HTTP 基本驗證),因此驗證發生在 MVC 網站上,而不是在 ARR 中:基本上,當使用者對網站進行驗證時,會建立表單驗證 cookie。
我希望 ARR 中發生以下情況:
- 為匿名使用者進行輸出快取。
- 對於經過驗證的用戶,僅快取靜態檔案(例如 .css、.js、.jpg 檔案),不快取動態頁面。
怎麼可能有針對這種場景的快取配置規則呢?我嘗試了多種方法:
- 快取標頭:MVC 應用程式發送的快取控制標頭在這裡不可用,因為想像一下:第 1 頁在 ARR 的快取中。使用者進行身份驗證並存取頁面 1。
- 無緩存URL:雖然我可能定義其中包含“no-arr-cache”的URL 不應被緩存,但可以與URL 重寫一起使用,即使用自定義URL 重寫提供程序,我會將經過身份驗證的請求重寫為...?除了 ARR 快取控制規則不關心查詢字串之外,問題在於 ARR 在評估快取配置規則時僅考慮請求的 URL,而不考慮重寫的 URL。
先感謝您!
我從IIS 論壇因為那裡沒有人回覆。
答案1
我就是這樣解決的。
我們必須牢記以下前提:
- ARR 使用 URL 來識別快取項目(根據配置,包括查詢字串;這應該是配置)。
- 在請求期間,可以指示 ARR 不快取當前請求的輸出。
- 如果當前請求(URL)的輸出之前已被緩存,那麼我無法知道如何指示 ARR 不使用快取的版本。
最重要的想法是更改請求的 URL,或者更確切地說,根據使用者是否經過身份驗證,使用 IIS URL 重寫以不同的方式重寫它。未經身份驗證的使用者將獲得使用 /my-page?authenticated=false 等提供的所有頁面,以及使用 /my-page?authenticated=true 提供的經過驗證的頁面。頁面將僅為匿名使用者緩存,因此 ARR 不會為經過驗證的使用者找到任何符合的快取條目。這樣,第三點就解決了。缺點是附加到 URL 的查詢字串可能會出現在 HTML 正文中,應使用 IIS URL 重寫將其刪除。
若要指示 ARR 不快取目前請求,請將 ARR_CACHE_CONTROL_OVERRIDE 伺服器變數設為「1,no-cache」(您可以透過重寫規則來執行此操作)。
您可以偵測使用者是否透過 IIS URL 重寫 IRewriteProvider 進行身份驗證(請參閱教學),即您可以使用此類提供者的輸出為經過身份驗證的使用者和匿名使用者以不同的方式重寫 URL。
希望對某人有幫助。