IIS 無副檔名檔案配置完整指南:MIME 類型、URL Rewrite 與最佳實踐

🌏 Read the English version


IIS 無副檔名檔案配置完整指南:MIME 類型、URL Rewrite 與最佳實踐

在現代 Web 開發中,無副檔名 URL(Extensionless URLs)已成為提升使用者體驗和 SEO 效能的標準實踐。例如,使用 /about 而非 /about.html,或是 RESTful API 的 /api/users/123 而非 /api/users/123.json。然而,Microsoft Internet Information Services (IIS) 預設並不支援直接訪問無副檔名檔案。本文將深入探討如何在 IIS 中配置此功能,涵蓋多種實作方法、最佳實踐以及常見問題排除。

為什麼需要無副檔名檔案支援?

1. 提升 URL 可讀性與 SEO

乾淨的 URL 結構不僅讓使用者易於記憶和分享,也符合搜尋引擎優化的最佳實踐:

  • 更簡潔example.com/products vs example.com/products.aspx
  • 技術無關:隱藏後端實作細節(ASPX、PHP、HTML 等)
  • SEO 友善:Google 建議使用簡單、描述性的 URL
  • 靈活性:技術遷移時無需變更公開 URL

2. RESTful API 設計規範

RESTful API 強調資源導向,URL 應代表資源而非檔案:

✅ 正確:GET /api/users/123
❌ 錯誤:GET /api/users.php?id=123
❌ 錯誤:GET /api/users/123.json

3. 內容協商(Content Negotiation)

無副檔名 URL 允許伺服器根據 HTTP Header(如 Accept)回傳不同格式:

GET /api/product/123
Accept: application/json  → 回傳 JSON
Accept: application/xml   → 回傳 XML
Accept: text/html         → 回傳 HTML

IIS 處理無副檔名檔案的挑戰

IIS 依賴檔案副檔名來決定如何處理請求:

  1. MIME 類型映射:根據副檔名決定 Content-Type Header
  2. Handler 選擇:決定使用哪個處理程序(靜態檔案、ASP.NET、PHP 等)
  3. 安全性檢查:根據副檔名應用請求篩選規則

當請求 /about(無副檔名)時,IIS 預設行為:

  • ❌ 無法決定 MIME 類型,回傳 404.3 Not Found
  • ❌ 無法選擇適當的 Handler
  • ❌ 可能被安全性規則阻擋

配置方法一:設定 MIME 類型

這是最基本的配置方法,適用於靜態檔案場景。

使用 IIS 管理員(GUI 方式)

  1. 開啟 IIS 管理員
    • Windows + R → 輸入 inetmgr → Enter
  2. 選擇目標網站
    • 在左側樹狀目錄中點擊您的網站
  3. 設定 MIME 類型
    • 雙擊「MIME 類型」功能
    • 點擊右側「新增…」
    • 輸入以下設定:
      • 副檔名.(注意:只有一個點)
      • MIME 類型:根據需求選擇

常用 MIME 類型選項

MIME 類型 用途 適用場景
text/plain 純文字檔案 README、LICENSE、文本文件
text/html HTML 文件 靜態 HTML 頁面
application/json JSON 資料 API 端點回傳 JSON
application/xml XML 資料 API 端點回傳 XML
application/octet-stream 二進位檔案 未知類型或強制下載

使用 web.config(推薦)

將配置寫入 web.config 可以版本控制,適合團隊協作:



  
    
      
      
    
  

重要提示:如果該 MIME 類型已存在,需先移除再新增:


  
  
  
  

配置方法二:URL Rewrite 模組

URL Rewrite 提供更靈活的解決方案,可以處理複雜的路由需求。

安裝 URL Rewrite 模組

  1. 下載並安裝 IIS URL Rewrite Module
  2. 重啟 IIS:iisreset

基本重寫規則範例

將無副檔名 URL 重寫為實際檔案:



  
    
      
        
        
          
          
            
            
            
            
            
            
          
          
        
      
    
  

進階範例:多層路徑支援


  
  
    
    
    
  
  

這個規則支援:

  • /about/about.html
  • /blog/post-title/blog/post-title.html
  • /api/users/profile/api/users/profile.html

ASP.NET 應用程式範例


  
  
    
    
  
  

配置方法三:Handler Mapping(ASP.NET 專用)

對於 ASP.NET 應用程式,可以配置 Handler 直接處理無副檔名請求。

web.config 配置



  
    
      
      
    
  

ASP.NET MVC / Web API 路由

搭配 ASP.NET Routing 使用:

// RouteConfig.cs
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // 無副檔名路由
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

完整 web.config 範例

結合多種配置方法的完整範例:



  
    
    
      
      
    

    
    
      
        
          
          
            
            
            
          
          
        
      
    

    
    
      
        
        
        
        
      
    

    
    
      
        
        
      
    
  

安全性考量與最佳實踐

1. 防止敏感檔案洩漏

配置無副檔名支援後,需明確禁止存取敏感檔案:


  
    
      
      
        
        
        
        
        
      
      
      
      
        
        
        
        
        
      
    
  

2. HTTPS 強制


  
    
    
      
      
        
      
      
    
  

3. 輸入驗證

限制 URL 長度與字元:


  
  
  
  
  

4. 效能優化

啟用輸出快取:


  
    
      
    
  

常見問題排除

問題 1:404.3 錯誤(MIME 類型未設定)

錯誤訊息:

HTTP Error 404.3 - Not Found
The page you are requesting cannot be served because of the extension configuration.

解決方案:

  1. 檢查 MIME 類型是否正確設定
  2. 確認 web.config 中有 <mimeMap fileExtension="." ... />
  3. 檢查 IIS 管理員的 MIME 類型設定

問題 2:500.19 錯誤(web.config 格式錯誤)

錯誤訊息:

HTTP Error 500.19 - Internal Server Error
The requested page cannot be accessed because the related configuration data is invalid.

解決方案:

  1. 檢查 web.config 的 XML 語法
  2. 確認所有標籤正確閉合
  3. 移除重複的 <mimeMap> 設定


  
  

問題 3:URL Rewrite 規則不生效

診斷步驟:

# 檢查 URL Rewrite 模組是否安裝
Get-WindowsFeature -Name Web-Url-Rewrite

# 啟用 Failed Request Tracing
# IIS 管理員 → 網站 → 失敗要求追蹤

常見原因:

  • URL Rewrite 模組未安裝
  • 規則順序錯誤(stopProcessing="true" 設定不當)
  • 條件判斷邏輯錯誤

問題 4:ASP.NET 應用程式回傳 404

檢查清單:

  1. 確認 Handler Mapping 已正確配置
  2. 檢查應用程式池的 .NET 版本
  3. 確認路由配置正確
# 檢查應用程式池設定
Get-IISAppPool | Select-Object Name, ManagedRuntimeVersion

測試與驗證

1. 基本功能測試

# 使用 PowerShell 測試
Invoke-WebRequest -Uri "http://localhost/about" -UseBasicParsing

# 檢查回傳的 Content-Type
(Invoke-WebRequest -Uri "http://localhost/about").Headers['Content-Type']

2. curl 測試

# 查看完整 HTTP 標頭
curl -I http://localhost/about

# 測試不同 Accept Header
curl -H "Accept: application/json" http://localhost/api/users
curl -H "Accept: text/html" http://localhost/api/users

3. 瀏覽器開發者工具

  1. 按 F12 開啟開發者工具
  2. 切換到「Network」分頁
  3. 訪問無副檔名 URL
  4. 檢查 HTTP 狀態碼、Content-Type 等標頭

實際應用場景

1. 靜態網站產生器

Jekyll、Hugo 等靜態網站產生器產生的檔案結構:

wwwroot/
├── index.html
├── about/
│   └── index.html       ← 需要支援 /about 訪問
├── blog/
│   └── post-title/
│       └── index.html   ← 需要支援 /blog/post-title 訪問

配置方法:


  
    
  

2. RESTful API 端點

api/
├── users       → users.aspx 或由 Web API 路由處理
├── products    → products.aspx
└── orders      → orders.aspx

3. 單頁應用程式 (SPA)

將所有路由導向 index.html


  
  
    
    
    
  
  

結論

在 IIS 中配置無副檔名檔案支援有多種方法,各有適用場景:

方法 適用場景 優點 缺點
MIME 類型 簡單靜態檔案 配置簡單、效能最佳 功能有限、無法處理複雜路由
URL Rewrite 複雜路由需求 靈活、功能強大 需要額外模組、配置複雜
Handler Mapping ASP.NET 應用程式 與 ASP.NET 深度整合 僅適用於 ASP.NET

建議選擇策略:

  • 靜態網站:MIME 類型 + URL Rewrite(基本規則)
  • ASP.NET 應用程式:Handler Mapping + ASP.NET Routing
  • RESTful API:URL Rewrite + Web API
  • SPA 應用程式:URL Rewrite(導向 index.html)

無論選擇哪種方法,都必須重視安全性配置,包括請求篩選、HTTPS 強制、輸入驗證等。透過本文介紹的配置方法與最佳實踐,您可以在 IIS 上建立安全、高效能、SEO 友善的無副檔名 URL 架構。

建議在生產環境部署前,先在測試環境進行完整的功能與效能測試,並監控錯誤日誌以即時發現潛在問題。

相關文章

Leave a Comment