私はスティーブに同意します。URLリライタが301リダイレクトを実行していますが、ページが必要とするすべての画像について、ブラウザは最初にサーバーにリクエストを送信して、301がCDNUrlにリダイレクトされていることを検出します。この時点で保存しているのは、コンテンツのダウンロードだけです。
その代わりに、応答がクライアントブラウザーに送信される前に、アセットの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" />