demo的参考地址:
http://www.mikesdotnetting.com/article/126/asp-net-mvc-prevent-image-leeching-with-a-custom-routehandler
在做一个图片防盗链的demo,但是遇到一些问题。
首先说一下思路,然后再提出所遇到的问题。
防盗链的要点:判断请求否是来自本站点(或者授权站点),如果不是,即判断是盗链,需要返回给提示文件或者404。
1、因为iis对静态文件(图片)的处理方式是找到了就直接返回,所以我们需要让图片请求进入可编程状态,假设,图片的请求和视图的请求一样,可以进入到RouteHandler不就ok了么。
所以我做了如下几步:
1、让图片文件进入路由匹配(RouteCollection),通过设置 RouteTable.Routes.RouteExistingFiles = true;(这句的意思是让所有请求都通过路由来匹配,这么理解是否正确???)
2、添加图片请求处理类 ImageRouteHandler处理图片请求。(如果合法即非盗链,返回正确图片,否则返回404或其他处理)
代码如下(我创建的是空的mvc项目)
ImageHandler.cs 类文件如下:
public class ImageHandler : IHttpHandler { public ImageHandler(RequestContext context) { ProcessRequest(context); } private static void ProcessRequest(RequestContext requestContext) { var response = requestContext.HttpContext.Response; var request = requestContext.HttpContext.Request; var server = requestContext.HttpContext.Server; var validRequestFile = requestContext.RouteData.Values["filename"].ToString(); const string invalidRequestFile = "thief.png"; var path = server.MapPath("~/graphics/"); response.Clear(); response.ContentType = GetContentType(request.Url.ToString()); if (request.ServerVariables["HTTP_REFERER"] != null && request.ServerVariables["HTTP_REFERER"].Contains("http://localhost:8010/")) //mikesdotnetting.com { response.TransmitFile(path + validRequestFile); } else { response.TransmitFile(path + invalidRequestFile); } response.End(); } private static string GetContentType(string url) { switch (Path.GetExtension(url)) { case ".gif": return "Image/gif"; case ".jpg": return "Image/jpeg"; case ".png": return "Image/png"; default: break; } return null; } public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { throw new NotImplementedException(); } }
ImageRouteHandler.cs类文件如下:
public class ImageRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new ImageHandler(requestContext); } }
RouteConfig.cs 文件(添加路由)
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.Add("ImagesRoute", new Route("graphics/{filename}", new ImageRouteHandler()));//添加路由 routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); RouteTable.Routes.RouteExistingFiles = true;//确保所有路由都通过 RouteCollection 匹配 } }
怎么都没人回答呢???
你搜一下IIS 上还要不要配置些什么东西
那篇文章没有,我现在在找 静态文件如何通过路由处理。。谢谢!
@qingYun: 看看这篇文章http://www.cnblogs.com/xyyt/p/3978784.html
@balahoho:
http://www.paraesthesia.com/archive/2011/07/21/running-static-files-through-virtualpathprovider-in-iis7.aspx/
差不多,这都需要额外的配置,和我看的那篇文章有点小出入,主贴中没有提到其他配置,而是
RouteTable.Routes.RouteExistingFiles = true;
@qingYun: web.config里面修改试试
@balahoho: 嗯嗯,谢谢。