Вот как я сделал на своем сайте:
- Настройка веб-сайта на IIS с пулом приложений ASP.NET
- Установите узел привязки на
your.domain.com
- Примечание: вы не можете использовать
domain.com
, иначе субдомен не останется без cookie
- Создать на сайте папку с именем
Static
- Настройте другой веб-сайт, укажите на папку
Static
, созданную ранее.
- Установите узел привязки на
static.domain.com
- Использование пула приложений с неуправляемым кодом
- В настройках откройте Session State и отметьте
Not enabled
.
Теперь у вас есть статический веб-сайт. Для настройки откройте файл web.config
в папке Static
и замените его следующим:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.web>
<sessionState mode="Off" />
<pages enableSessionState="false" validateRequest="false" />
<roleManager>
<providers>
<remove name="AspNetWindowsTokenRoleProvider" />
</providers>
</roleManager>
</system.web>
<system.webServer>
<staticContent>
<clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
</staticContent>
<httpProtocol>
<customHeaders>
<remove name="X-Powered-By" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
Это будет кэшировать файлы в течение 30 дней, удалить RoleManager (я не знаю, если он что-то изменит, но я удалил все, что смог найти) и удалить элемент из заголовков ответа.
Но здесь есть проблема, ваш контент будет кэшироваться даже при развертывании новой версии, поэтому во избежание этого я сделал вспомогательный метод для MVC. По сути, вам нужно добавить некоторую строку QueryString, которая будет меняться при каждом изменении этих файлов.
default.css?v=1 ?v=2 ...
Мой метод MVC получает дату последней записи и добавляет к файлу URL:
public static string GetContent(this UrlHelper url, string link)
{
link = link.ToLower();
// last write date ticks to hex
var cacheBreaker = Convert.ToString(File.GetLastWriteTimeUtc(url.RequestContext.HttpContext.Request.MapPath(link)).Ticks, 16);
// static folder is in the website folders, but instead of
// www.domain.com/static/default.css I convert to
// static.domain.com/default.css
if (link.StartsWith("~/static", StringComparison.InvariantCultureIgnoreCase))
{
var host = url.RequestContext.HttpContext.Request.Url.Host;
host = String.Format("static.{0}", host.Substring(host.IndexOf('.') + 1));
link = String.Format("http://{0}/{1}", host, link.Substring(9));
// returns the file URL in static domain
return String.Format("{0}?v={1}", link, cacheBreaker);
}
// returns file url in normal domain
return String.Format("{0}?v={1}", url.Content(link), cacheBreaker);
}
И использовать его (MVC3 Razor):
<link href="@Url.GetContent("~/static/default.css")" rel="stylesheet" type="text/css" />
Если вы используете приложение другого типа, вы можете сделать то же самое, создайте метод для добавления HtmlLink на страницу.