Я согласен со Стивом.У вас есть программа перезаписи URL, которая выполняет перенаправление 301, но для каждого изображения, которое требуется странице, браузер все еще сначала запрашивает сервер, чтобы определить, что он перенаправлен на 301 на URL CDN.Единственное, что вы сохраняете в данный момент, - это загрузка контента.
Вместо этого вы можете просто установить фильтр ответов, который будет изменять URL-адреса ресурсов перед отправкой ответа.в браузер клиента.Таким образом, клиентский браузер никогда не должен делать какие-либо вызовы на ваш сервер для статических активов:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.RequestContext.HttpContext.Response.Filter = new CdnResponseFilter(filterContext.RequestContext.HttpContext.Response.Filter);
}
А затем CdnResponseFilter:
public class CdnResponseFilter : MemoryStream
{
private Stream Stream { get; set; }
public CdnResponseFilter(Stream stream)
{
Stream = stream;
}
public override void Write(byte[] buffer, int offset, int count)
{
var data = new byte[count];
Buffer.BlockCopy(buffer, offset, data, 0, count);
string html = Encoding.Default.GetString(buffer);
html = Regex.Replace(html, "src=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase);
html = Regex.Replace(html, "href=\"/Content/([^\"]+)\"", FixUrl, RegexOptions.IgnoreCase);
byte[] outData = Encoding.Default.GetBytes(html);
Stream.Write(outData, 0, outData.GetLength(0));
}
private static string FixUrl(Match match)
{
//However the Url should be replaced
}
}
В результате все содержимоеактивы, которые выглядят как <img src="\Content\whatever.jpg" />
, будут конвертированы в <img src="cdn-url.com\Content\whatever.jpg" />