轉載自:http://www.cnblogs.com/xclw/p/6676886.html
某些情況下我們需要在服務器上保存一些靜態文件,比如用戶上傳到服務器的文件,如果剛好這些文件的保存目錄是應用程序目錄下的一個子目錄的話,別人就可以通過Url直接訪問這個文件。
例如:在應用程序目錄下的UploadFiles子目錄里保存用戶上傳上來的文件abc.txt, 那么別人就可以有通過url http://hostname/UploadFiles/aaa.txt 直接訪問到這個文件
出於安全的考慮,你不想用戶通過Url的方式訪問這些文件,可以通過如下方法
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.RouteExistingFiles = true; 6 } 7 }
這段代碼的作用是告訴服務器,對於靜態文件仍然要走路由(默認情況下如果服務器發現請求的文件在硬盤上存在的話,就用繞過路由,直接從硬盤讀取文件並返回)
但僅僅這么還不夠,如果你是在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文件還有一些圖片文件,
所以我們還需要告訴服務器,這些文件需要繞過路由系統,直接從硬盤上讀取就行了,方法如下:
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.RouteExistingFiles = true; 6 routes.IgnoreRoute("Content/{*relpath}"); 7 routes.IgnoreRoute("Scripts/{*relpath}"); 8 } 9 }
對於我的站點而言,Content目錄下放了css文件和圖片文件,Scripts目錄下放的是js文件,我通過上面的代碼指定這兩個目錄的文件繞過路由
如果你的目的僅僅是不讓用戶通過Url訪問靜態文件,到這一步已經實現目的了,但我們還可以做進一步的工作,那就是把用戶對靜態文件請求路由到一個自定義的Controller上去
具體做法如下:
1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.RouteExistingFiles = true; 6 routes.IgnoreRoute("Content/{*relpath}"); 7 routes.IgnoreRoute("Scripts/{*relpath}"); 8 routes.MapRoute(name: "uploadFiles", 9 url: "UploadFiles/{*filename}", 10 defaults: new { controller = "StaticFile", action = "Index" }); 11 } 12 }
我把所有指向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>
這樣當用戶訪問這些靜態文件時,我會給一個友好提示信息
當然你可以自己寫任何處理邏輯