天天看點

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

背景

在預設情況下,MVC架構是支援對伺服器靜态資源的通路的,我們在項目根目錄下建立一個Content檔案夾,然後添加一個命名為“StaticContent.html”的html檔案,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

StaticContent.html中的代碼如下圖所示:

This is the static html file(~/Content/StaticContent.html)

運作項目,輸入URL,可以看到能通路到這個檔案:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過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 }

);

}

再次運作項目, 還是能通路到,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

配置應用程式伺服器

以上這麼做還不夠,需要配置應用程式伺服器。首先啟動MVC項目,在右下角找到 IIS Express,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

右鍵點選, 選擇“顯示所有應用程式”後,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

單擊網站名稱後,在出現的配置一欄中,再次點選配置,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

在打開的檔案中,搜尋“UrlRoutingModule-4.0” 關鍵字,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

将preCondition屬性設定為空字元串,如下圖所示:

在VS中重新運作項目,讓修改後的配置生效,并導航到/content/StaticContent.html,可以看到映射已經生效:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

當然,可以自己修改Customer控制器下List方法傳回的頁面代碼,增加個提示,比如“無法通路資源檔案”什麼的。

注意IIS 和 IIS Express的處理方式是有差別的,如果你的程式釋出到IIS上,需要在web.config中添加如下代碼,否則靜态檔案還是會交由IIS處理,而不會被路由。如下圖所示:

.......

繞過路由系統

到這裡還沒結束,以上方法禁止了對所有資源檔案的通路。如果現在去請求scripts檔案夾下的靜态js檔案,能看到如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

如果希望排除某些資源檔案 ,繞過路由系統,可以用以下代碼:

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檔案,成功,如下圖所示:

asp.net routing html檔案不能通路,ASP.NET MVC 阻止通過URL通路伺服器上的靜态資源檔案...

本文結束 ,部分參考來自這篇文章