某些情况下我们需要在服务器上保存一些静态文件,比如用户上传到服务器的文件,如果刚好这些文件的保存目录是应用程序目录下的一个子目录的话,别人就可以通过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. Porsche Piwis Tester II V12.100 Version Released

    Piwis Tester II v12.100 Version released today! In this new version we can find the latest type Pors ...

  2. Docker Registry V2 with Nginx

    安装 nginx 修改/etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/cen ...

  3. 《CSS世界》读书笔记(五) --height:100%

    <!-- <CSS世界> 张鑫旭著 --> 相对简单而单纯的height:auto height:auto比width:auto简单的多,原因在于: CSS默认流是水平方向的, ...

  4. 利用ueditor保存到mysql数据库时出现乱码

    首先反复检查页面的字符编码,发现使用的都是 utf-8,再次检查数据库编码格式也用的是UTF-8.用format函数进行格式化,还是不起作用,最用把出现乱码的字段的数据类型由BLOB改成MEDIUMT ...

  5. 2019/3/28 wen 继承

  6. Objective-C不能以new开头命名属性

    ARC是在Xcode4.2推出的方便内存管理的一个特性,支持OS10.6及iOS4以后版本.引入ARC之后,相对应的内存管理使用方面做了必要的调整,这里不一一赘述:其中有一项就是文章题目说的,为了与手 ...

  7. [c/c++] programming之路(20)、字符串(一)

    一.字符串 #include<stdio.h> #include<stdlib.h> void main(){ ]="notepad"; printf(&q ...

  8. JS(JavaScript)的初了解2(更新中···)

    1.parseInt()    整数型 字符串中的数字取整 遇到第一个是非数字的字节就结束了. 2.parseFloat 浮点型 字符中的数字取整数和小数,有两个小数点的话第二个小数点无效第二个小数点 ...

  9. 变量和关系符和JAVA基本类型笔记与常考面试题

    变量的类型:数值型:整型(byte,short,int,long).浮点型(float,double)非数值型:布尔类型(boolean),字符型(char),字符串类型(String),其他引用型 ...

  10. vue搭建前端相关命令

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