0

一段时间以来,我一直在使用以下大部分 Global.asax (Application_Start) 代码,效果很好(相关)。我已经以这种方式配置它,以便在外部发起请求(热链接/直接请求)时在某些目录上提供带水印的图像。

  //ImageResizer
  Config.Current.Pipeline.Rewrite += delegate(IHttpModule mysender, HttpContext context, IUrlEventArgs ev)
  {
     if (context.Request.UrlReferrer == null || (context.Request.UrlReferrer != null && context.Request.UrlReferrer.Host != "www.mydomain.com"))
     {
        //File has been requested from outside of the target domain, so see if it meets criteria for watermarking
        string folder1 = VirtualPathUtility.ToAbsolute("~/images/products");
        string folder2 = VirtualPathUtility.ToAbsolute("~/images/product-showcase");
        if (ev.VirtualPath.StartsWith(folder1, StringComparison.OrdinalIgnoreCase) || ev.VirtualPath.StartsWith(folder2, StringComparison.OrdinalIgnoreCase))
        {
           //Image is within the targeted folders. If the requested file is jpg, change extension to png
           if (Path.GetExtension(ev.VirtualPath) == ".jpg") ev.VirtualPath = Path.ChangeExtension(ev.VirtualPath, ".png");

           //Estimate final image size, based on the original image being 300x300. 
           System.Drawing.Size estimatedSize = ImageBuilder.Current.GetFinalSize(new System.Drawing.Size(300, 300), new ResizeSettings(ev.QueryString));
           if (estimatedSize.Width > 100 || estimatedSize.Height > 100)
           {
              //It's over 100px, apply watermark and change the ouput format
              ev.QueryString["watermark"] = "style";
              ev.QueryString["bgcolor"] = "ffffff";
              ev.QueryString["format"] = "jpg";
           }
        }
     }
  };

但是,我刚刚修改了我的网页,以便通过添加 &format=jpg 查询字符串来提供我的产品图像。我知道适当的 MIME 类型会提供给 Web 浏览器,这真的很酷,但是文件名呢?例如 /images/products/widget1.png?watermark=c&format=jpg 仍然指的是 png 图像,即使提供的格式是 jpg。我担心的是,像 Google 图片这样的抓取工具或图像聚合器可能 1)想要将 URL 剥离为文件名,或者 2)考虑 MIME 类型并通过更改扩展名重新引用它。我不确定 Google 图片实际上对上述 URL 做了什么,并且想要处理这两种情况。[如果我知道的话,我可能会更好地针对这种情况]

为了处理场景 2,我只是在上面添加了路径扩展检查,一切都处理得很顺利。顺便说一句,我在目标目录中只有 .png 图像。

对于场景 1,对 .png 文件的外部请求通过,但该文件实际上被编码为 .jpg,这就是失败的部分。我希望我可以重写扩展。我尝试使用 Response.Redirect 执行此操作,但由于我在 Application_Start 内部工作,因此我无权访问它。

4

1 回答 1

1

在使代码复杂化之前,请确保您知道要修复什么。据我所知,您描述的问题是理论上的,不存在。如果您能解释您所看到并试图解决的实际问题,那将很有帮助。

重写不会改变浏览器看到的内容——它发生在服务器内。只有 HTTP 重定向会更改对浏览器或 Google 可见的 URL,这是非常不可取的,因为它会使延迟加倍。

您可以使用Content-disposition HTTP header影响下载或保存图像时使用的文件名,但这不会影响浏览器 URL 或 SEO。

于 2013-11-13T23:37:43.250 回答