微軟在 ASP.NET MVC 路由、IIS URL Rewrite 等處理 URI Path 時,**省略開頭斜線** (`/over/there` → `over/there`),違背 RFC 3986 標準,導致規則撰寫易誤。本文對比標準與實作差異。
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/123 | article/123 | `^article/123$` |
| ASP.NET MVC Route | /Home/Index | Home/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 }
);
標準是給互通用的,實作是給自家用的。微軟選擇內部一致性而非標準合規,開發者適應即可,切勿試圖「修正」框架行為。