首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

URI Path 少一個斜線的標準差異:微軟 vs IETF RFC 3986

     編輯:關於.NET

微軟在 ASP.NET MVC 路由、IIS URL Rewrite 等處理 URI Path 時,**省略開頭斜線** (`/over/there` → `over/there`),違背 RFC 3986 標準,導致規則撰寫易誤。本文對比標準與實作差異。

RFC 3986 URI 結構定義

URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
hier-part = "//" authority path-abempty
          / path-absolute
          / path-rootless
          / path-empty

path-absolute = "/" [ segment-nz *( "/" segment ) ]

關鍵:`path-absolute` 以 `/` 開頭,例如 `/over/there`。

微軟實作差異

場景標準 Path微軟期望正則/路由寫法
IIS URL Rewrite/article/123article/123`^article/123$`
ASP.NET MVC Route/Home/IndexHome/Index`routes.MapRoute("", "Home/Index", ...)`
根目錄/(空字串)`^$`

實際踩坑案例

// URL Rewrite web.config
<rule name="Article" stopProcessing="true">
  <match url="^article/(\d+)$" /> <!-- 必須無開頭斜線 -->
  <action type="Rewrite" url="/Article/Detail/{R:1}" />
</rule>

// MVC RouteConfig.cs
routes.MapRoute(
    "Default", 
    "{controller}/{action}/{id}", // 無開頭斜線
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

根因推測

  • ASP.NET 早期設計將 Path 視為「相對於應用程式根目錄的相對路徑」,自然省略 `/`
  • 此決策貫穿 `HttpRequest.Path`、`VirtualPathUtility`、路由、Rewrite 等所有 API
  • 雖違背 RFC,但內部自洽,**開發者只需記住「微軟 Path 無開頭斜線」**即可

最佳實踐建議

  1. 撰寫 Rewrite 規則 / MVC 路由時,**永遠不寫開頭 `/`**
  2. 若需跨平台共用正則 (如 Node.js/Java 同規則),需在微軟端加前置 `/` 或在其他端移除
  3. 單元測試驗證:`request.Path` 應為 `Home/Index` 而非 `/Home/Index`

標準是給互通用的,實作是給自家用的。微軟選擇內部一致性而非標準合規,開發者適應即可,切勿試圖「修正」框架行為。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved