ASP.NET MVC 阻止通过URL访问服务器上的静态资源文件

本文介绍了如何在ASP.NET MVC中阻止用户通过URL直接访问静态资源文件,如HTML。通过定义路由、配置应用程序服务器以及使用IgnoreRoute方法来限制对特定文件的访问。文中详细阐述了每个步骤的操作过程,包括修改路由配置、调整IIS Express设置以及排除特定文件夹的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景 

在默认情况下,MVC框架是支持对服务器静态资源的访问的,我们在项目根目录下新建一个Content文件夹,然后添加一个命名为“StaticContent.html”的html文件,如下图所示:

                                         

 StaticContent.html中的代码如下图所示:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
	<meta charset="utf-8" />
</head>
<body>
    This is the static html file(~/Content/StaticContent.html)
</body>
</html>

运行项目,输入URL,可以看到能访问到这个文件: 

                          

 


为磁盘文件定义路由 

为了安全考虑,希望用户不能访问某些文件夹,我们可以增加如下代码:

        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.RouteExistingFiles = true;
        }

这段代码告诉MVC框架,对于静态文件我们也要走路由机制(默认情况下,MVC框架发现请求的文件存在于服务器上时,会绕过路由机制,直接读取文件) 

然后新建一条更具体的静态路由,映射文件路径请求,如下图所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.RouteExistingFiles = true;

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapMvcAttributeRoutes();
    
    //映射到Customer控制器上的List方法
    routes.MapRoute("DiskFile","Content/StaticContent.html",new { controller = "Customer",action = "List"});

    routes.MapRoute(
       name: "Default",
       url: "{controller}/{action}/{id}",
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
}

再次运行项目, 还是能访问到,如下图所示:

                    


配置应用程序服务器 

以上这么做还不够,需要配置应用程序服务器。首先启动MVC项目,在右下角找到 IIS Express,如下图所示:

                                                                    

右键点击, 选择“显示所有应用程序”后,如下图所示:

                                         

单击网站名称后,在出现的配置一栏中,再次点击配置,如下图所示:

                                            

在打开的文件中,搜索“UrlRoutingModule-4.0” 关键字,如下图所示:

将preCondition属性设置为空字符串,如下图所示: 

<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />

在VS中重新运行项目,让修改后的配置生效,并导航到/content/StaticContent.html,可以看到映射已经生效: 

                    

当然,可以自己修改Customer控制器下List方法返回的页面代码,增加个提示,比如“无法访问资源文件”什么的。 


注意IIS 和 IIS Express的处理方式是有区别的,如果你的程序发布到IIS上,需要在web.config中添加如下代码,否则静态文件还是会交由IIS处理,而不会被路由。如下图所示:

<configuration>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
     .......
  </system.webServer>
</configuration>

 


绕过路由系统 

到这里还没结束,以上方法禁止了对所有资源文件的访问。如果现在去请求scripts文件夹下的静态js文件,能看到如下图所示:

           

如果希望排除某些资源文件 ,绕过路由系统,可以用以下代码:

public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.RouteExistingFiles = true;
            routes.IgnoreRoute("Scripts/{*pathInfo}");
        }
    }

 在这种情况下,URL模式将匹配任何两个片段的URL,第一个片段是“Scripts”,第二个片段{*pathInfo}是所有路径的意思。

IgnoreRoute方法在RouteCollection中创建了一个条目,在RouteCollection中路由处理程序是StopRoutingHandler类的一个实例,而不是MvcRouteHandler类。路由系统被硬编码以识别这个处理程序。如果传递给IgnoreRoute方法的URL模式匹配,那么后面的路由将不会被计算,就像匹配一个普通的路由一样。

再次访问JS文件,成功,如下图所示: 

 


本文结束 ,部分参考来自这篇文章

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值