某些情况下我们需要在服务器上保存一些静态文件,比如用户上传到服务器的文件,如果刚好这些文件的保存目录是应用程序目录下的一个子目录的话,别人就可以通过Url直接访问这个文件。

例如:在应用程序目录下的UploadFiles子目录里保存用户上传上来的文件abc.txt, 那么别人就可以有通过url http://hostname/UploadFiles/aaa.txt 直接访问到这个文件

出于安全的考虑,你不想用户通过Url的方式访问这些文件,可以通过如下方法

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

这段代码的作用是告诉服务器,对于静态文件仍然要走路由(默认情况下如果服务器发现请求的文件在硬盘上存在的话,就用绕过路由,直接从硬盘读取文件并返回)

但仅仅这么还不够,如果你是在Debug模式下,还需要对IIS Express做一些设置,方法如下:

通过Visual Studio启动IIS Express(随便找一个Web项目,在VS中打开,F5运行),在任务栏会看到IIS Express的图标

在图标上右键=>显示所有程序

点击网站名称这一栏,会出现如图所示的界面,点击配置,会在VS中打开这个config文件

Ctrl+F搜索"UrlRoutingModule-4.0", 将preCondition设置为空

保存文件,重新启动程序

你会发现通过Url不能直接访问本地的静态文件了

注意IIS 和 IIS Express的处理方式是有区别的

如果你的程序发布到IIS上,需要在web.config中添加如下代码,否则静态文件还是会交由IIS处理,而不会被路由

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

到这里还没有完,因为这样做所有的对静态文件的访问都交给路由来处理了,但有些文件我们还希望不走路由的,比如js文件,css文件还有一些图片文件,

所以我们还需要告诉服务器,这些文件需要绕过路由系统,直接从硬盘上读取就行了,方法如下:

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

对于我的站点而言,Content目录下放了css文件和图片文件,Scripts目录下放的是js文件,我通过上面的代码指定这两个目录的文件绕过路由

如果你的目的仅仅是不让用户通过Url访问静态文件,到这一步已经实现目的了,但我们还可以做进一步的工作,那就是把用户对静态文件请求路由到一个自定义的Controller上去

具体做法如下:

     public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.RouteExistingFiles = true;
routes.IgnoreRoute("Content/{*relpath}");
routes.IgnoreRoute("Scripts/{*relpath}");
routes.MapRoute(name: "uploadFiles",
url: "UploadFiles/{*filename}",
defaults: new { controller = "StaticFile", action = "Index" });
     }
  }

我把所有指向UploadFiles目录下静态文件的请求都路由到StaticFile/Index

controller和view的代码如下:

    public class StaticFileController : Controller
{
// GET: StaticFile
public ActionResult Index(string filename)
{
ViewBag.FileName = filename;
return View();
}
}
@{
ViewBag.Title = "Index";
} <h2>您请求的文件@(ViewBag.FileName)被禁止访问</h2>

这样当用户访问这些静态文件时,我会给一个友好提示信息

当然你可以自己写任何处理逻辑

ASP.NET MVC 阻止通过Url直接访问服务器上的静态文件的更多相关文章

  1. 【ASP.NET MVC 牛刀小试】 URL Route

    例子引入 先看看如下例子,你能完全明白吗? using System; using System.Collections.Generic; using System.Linq; using Syste ...

  2. 白话ASP.NET MVC之一:Url 路由

    好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...

  3. Asp.Net MVC路由生成URL过程

    这次谈一谈Asp.Net MVC中所学到的路由生成URL的相关技术,顺便提一提遇到的一些坑,真的是掉坑掉多了,也就习以为常了,大不了从坑里再爬出来.初学者,包括我,都以为,mvc的核心是模型视图控制器 ...

  4. ASP.NET MVC 4 (八) URL链接和Ajax帮助函数

    使用帮助函数创建链接 MVC提供一些帮助函数创建链接,这些函数根据路径映射表自动调整生成的URL: 说明 示例 输出结果 应用程序相对URL Url.Content("~/Content/S ...

  5. 转:在ASP.NET MVC中通过URL路由实现对多语言的支持

    对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎 ...

  6. 如何把ASP.NET MVC项目部署到本地IIS上

    默认情况下,在VisualStudio中开发网站,会运行在IISExpress中,如果想把网站部署到本地的IIS服务器上该怎么办呢? 一.首先,以管理员身份运行VisualStudio,否则在修改项目 ...

  7. Asp.Net MVC中记录错误日志保存到本地txt文件

    为了方便查询系统出错弄个错误日志出来对于维护运维来说是很有必要的. 1.在Asp.Net MVC项目中的App_Start添加一个用于处理异常类的文件ErrorLog让他继承HandleErrorAt ...

  8. .NET/ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  9. ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

随机推荐

  1. springMVC学习之路4-最后的征程:整合hibernate

    今天小编很开心,因为学习springMVC基础的路终于走到了尽头,也成功搭建了一个SSH框架,暗自在心里默默地开心了1秒钟. 好了,回归正题:整合Hibernate.上一节,我为大家分享我整合spri ...

  2. flutter的webview案例

    flutter 加载webview 安装插件  flutter_webview_plugin: ^0.2.1 从listview点击item跳转页面加载详情页案例 import 'dart:async ...

  3. MIME类型解析

    MIME(Multipurpose Internet Mail Extensions)多用途网络邮件扩展类型,可被称为Media type或Content type, 它设定某种类型的文件当被浏览器打 ...

  4. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

  5. vue搭建前端相关命令

    Vue搭建.新建工程并打开浏览器调试的指令: 这四行命令就是我们接下来工作了. 1.npm install –global vue-cli 我们在安装好nodejs后就可以用到“npm”这个前缀指令, ...

  6. js运行机制详解:event loop

    总结 阮一峰老师的博客 一.为什么JavaScript是单线程 JavaScript语言的一大特点就是单线程 那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. JavaScript ...

  7. js实现千位分隔

    最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数 ...

  8. selenium+java 模糊搜索列表

    判断搜索结果是否正确 例子: 显示列表 相关HTML 获取职位名称元素 List<WebElement> elements = driver.findElements(By.cssSele ...

  9. SpringMVC 拦截器HandlerInterceptor(一)

    HandlerInterceptor 接口: 进入 Handler方法之前执行比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行 boolean preHandle(HttpS ...

  10. 简单的class及运算符重载

    #include <iostream> #include <vector> #include <algorithm> using namespace std; cl ...