我在Amazon S3上托管我的图片,只存储一个图像尺寸。
到目前为止,我已成功使用Imageresizer按要求调整图片大小。
现在我需要介绍Cloudfront CDN,它给了我很多困难。
我已根据documentation设置了我的配置。
像这样:
<resizer>
<diskcache dir="~/app_data" autoClean="true"/>
<clientcache minutes="1440"/>
<cloudfront redirectThrough="http://cdn.example.com" redirectPermanent="false"/>
<plugins>
<add name="DiskCache"/>
<add name="ClientCache"/>
<add name="MvcRoutingShim"/>
<add name="CloudFront"/>
</plugins>
</resizer>
然后我会抓住我的应用程序的任何URL:
private static void ImageResizer_OnPostAuthorizeRequestStart(
IHttpModule sender2, HttpContext context)
{
string path = Config.Current.Pipeline.PreRewritePath;
if (!path.StartsWith(PathUtils.ResolveAppRelative("~/cdn/"),
StringComparison.OrdinalIgnoreCase))
{
return;
}
Config.Current.Pipeline.SkipFileTypeCheck = true;
Config.Current.Pipeline.ModifiedQueryString["cache"]
= ServerCacheMode.Always.ToString();
}
以便Imageresizer可以处理它们。
如果是这样,它会更改我的URL以使用正确的CDN路径,但它也会将查询字符串参数更改为分号:
对此:
不幸的是,亚马逊S3并不喜欢这样,并将其作为拒绝访问。然而,亚马逊很乐意为原始查询字符串提供服务。
那么,如何保留查询字符串以防止Imageresizer将参数更改为分号?
或者配置亚马逊,以便无论分号如何都能提供图像?
答案 0 :(得分:1)
您不使用S3的CloudFront ,您同时使用它们。您的cloudfront分发应指向运行ImageResizer 的服务器,然后使用S3Reader访问Amazon S3。 CloudFront应永远直接指向S3;这将消除图片中的ImageResizer。