首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

ASP.NET MVC 路由衝突導致 403 禁止存取:URL Rewrite 完美解決方案

     編輯:程式設計疑難解答

問題現象

ASP.NET MVC 專案中設定路由將 https://www.test.com/reports/ 導向 https://www.test.com/ReaResport/List,但直接存取 /reports/ 卻回傳 403 - 禁止存取:存取被拒絕。

根本原因

IIS 預設將 /reports/ 識別為實體目錄而非 MVC 路由。當網站根目錄下存在同名 reports 資料夾時,IIS 靜態檔案處理模組優先攔截請求,嘗試列出目錄內容,因預設禁止目錄瀏覽而回傳 403。

解決方案:URL Rewrite 模組

步驟一:安裝 URL Rewrite 模組

步驟二:Web.config 設定重寫規則



  
    
      
        
          
          
        
        
          
          
        
      
    
  

規則說明

規則名稱匹配模式動作類型用途
ReportsRoute^reports/?$Redirect (302)處理 /reports 與 /reports/ 根路徑導向
ReportsSubPath^reports/(.*)Rewrite處理 /reports/子路徑 透明轉發

替代方案比較

方案優點缺點適用場景
URL Rewrite不修改程式碼、效能好、支援正則需安裝 IIS 模組生產環境、既有專案快速修復
RouteConfig 設定純程式碼控制、版本管理友善需處理實體目錄衝突新專案、無同名目錄
重命名資料夾最簡單可能影響其他參考資料夾無其他用途

RouteConfig 互補設定(建議)


public class RouteConfig {
    public static void RegisterRoutes(RouteCollection routes) {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        
        // 明確忽略 reports 實體目錄,交由 URL Rewrite 處理
        routes.IgnoreRoute("reports/{*pathInfo}");
        
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

驗證清單

  • ✅ /reports/ → 302 導向 /ReaResport/List
  • ✅ /reports/detail/123 → 透明轉發至 /ReaResport/detail/123
  • ✅ 原有 MVC 路由正常運作
  • ✅ 靜態資源(CSS/JS/圖片)不受影響
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved