Cache-control: no-store, must-revalidate не отправляется браузеру клиента в IIS7 + ASP.NET MVC
Я пытаюсь убедиться, что определенная страница никогда не кэшируется и никогда не отображается, когда пользователь нажимает кнопку "Назад". Этот очень высоко оцененный ответ (в настоящее время 1068 upvotes) говорит, чтобы использовать:
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Однако в IIS7/ASP.NET MVC, когда я отправляю эти заголовки, вместо этого клиент видит эти заголовки ответов:
Cache-control: private, s-maxage=0 // that not what I set them to
Pragma: no-cache
Expires: 0
Что случилось с заголовком управления кешем? Заменяет ли что-то, родное IIS7 или ASP.NET? Я проверил свое решение, и у меня нет кода, который перезаписывает этот заголовок.
Когда я добавляю Response.Headers.Remove("Cache-Control");
во-первых, это не имеет значения:
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Когда я добавляю атрибут [OutputCache]
:
[OutputCache(Location = OutputCacheLocation.None)]
public ActionResult DoSomething()
{
Response.Headers.Remove("Cache-Control");
Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
var model = DoSomething();
return View(model);
}
Затем заголовки ответов клиента меняются на:
Cache-control: no-cache
Pragma: no-cache
Expires: 0
Что ближе, но все равно не заголовки, которые я хочу отправить. Где эти заголовки переопределяются и как я могу остановить его?
EDIT: я проверил, и неправильные заголовки отправляются в Chrome, FF, IE и Safari, поэтому он выглядит как проблема с сервером, а не проблема, связанная с браузером.
Ответы
Ответ 1
Через пробную версию и ошибку я обнаружил, что один из способов правильно настроить заголовки для IIS7 в ASP.NET MVC:
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.AppendCacheExtension("no-store, must-revalidate");
Response.AppendHeader("Pragma", "no-cache");
Response.AppendHeader("Expires", "0");
Первая строка устанавливает Cache-control
в no-cache
, а вторая строка добавляет другие атрибуты no-store, must-revalidate
.
Это может быть не единственный способ, но предоставляет альтернативный метод, если сбой более простой Response.AppendHeader("Cache-control", "no-cache, no-store, must-revalidate");
.
Другие связанные с IIS7 вопросы управления кешем, которые могут быть решены этим: