UrlRewriter (常指 Helicon Tech ISAPI_Rewrite) 是 IIS 平台上最成熟的 URL 重寫模組,透過 httpd.ini 規則檔實現 Apache mod_rewrite 風格的 URL 映射。本文涵蓋安裝驗證、規則語法、實戰範例、常見坑點與 SEO 最佳實踐,適用於 ASP/ASP.NET/PHP 混合託管環境。
.asp/.aspx/.php 副檔名,避免暴露後端技術;遷移平台時只需改規則,前端 URL 不變。/article.aspx?id=342&title=seo-tips 重寫為 /article/342/seo-tips,關鍵字前置、層級清晰,利於搜尋引擎抓取與排名。1. 確認 IIS 已安裝並啟用 ISAPI 擴充功能 (IIS 6: Web 服務擴充功能 → 允許 ISAPI_Rewrite)
2. 將安裝包中 test 目錄下的 UrlRewrite.html 複製到網站根目錄
3. 瀏覽 https://your-domain/UrlRewrite.html
→ 頁面顯示 "ISAPI_Rewrite installed successfully" 即安裝成功
路徑:安裝目錄 \httpd.ini (建議先備份)。規則採 Perl 相容正則 (PCRE),區分大小寫,逐行匹配,首條匹配生效。
| 指令 | 說明 | 範例 |
|---|---|---|
RewriteRule | 核心重寫指令 | RewriteRule /old.html /new.aspx |
RewriteCond | 條件判斷 (支援 %\{HTTP_HOST\}, %\{REQUEST_URI\} 等) | RewriteCond %\{HTTP_HOST\} ^old\.domain\.com$ |
RewriteHeader | 修改 HTTP 標頭 | RewriteHeader User-Agent: .*bot.* Blocked |
[L] | Last - 停止後續規則處理 | RewriteRule ^/admin - [F,L] |
[R=301] | 外部重導向 (301 永久移動) | RewriteRule ^old/(.*) /new/$1 [R=301,L] |
[NC] | No Case - 不區分大小寫 | RewriteRule ^IMG/(.*) /images/$1 [NC] |
[QSA] | Query String Append - 保留原查詢字串 | RewriteRule ^search/(.*) /search.aspx?q=$1 [QSA] |
# /test.html → /test.asp
RewriteRule /test\.html /test.asp [L]
# /tags/123 → /tags.php?tags=123
RewriteRule /tags/([0-9]+) /tags.php?tags=$1 [L,QSA]
# /article/342/seo-friendly-title → /article.aspx?id=342&title=seo-friendly-title
RewriteRule /article/([0-9]+)/([_0-9a-z-]+) /article.aspx?id=$1&title=$2 [L,NC]
# m.example.com/* → /mobile/$1
RewriteCond %\{HTTP_HOST\} ^m\.example\.com$
RewriteRule ^/(.*) /mobile/$1 [L]
# 老域名 301 轉新域名
RewriteCond %\{HTTP_HOST\} ^old\.example\.com$ [NC]
RewriteRule ^/(.*) https://new.example.com/$1 [R=301,L]
# 圖片/CSS/JS 設定長期快取 (需 IIS 輸出快取配合)
RewriteRule \.(jpg|jpeg|png|gif|css|js)$ - [L]
# 防盜鏈:非本站 Referer 導向預設圖
RewriteCond %\{HTTP_REFERER\} !^$
RewriteCond %\{HTTP_REFERER\} !example\.com [NC]
RewriteRule \.(jpg|png|gif)$ /images/hotlink-denied.jpg [R=302,L]
# 封鎖常見掃描路徑
RewriteRule ^/(phpmyadmin|wp-admin|\.git|\.svn|web\.config) - [F,L]
# 封鎖 SQL 注入關鍵字 (簡易示範,生產環境建議用 WAF)
RewriteCond %\{QUERY_STRING\} (union|select|insert|drop|--|;) [NC]
RewriteRule .* - [F,L]
原因:重寫後瀏覽器以「虛擬路徑層級」請求資源 (如 /article/342/style.css),但實際檔案在 /style.css。
解決:
/style.css) 或 <base href="/">httpd.ini 必須儲存為 ANSI/UTF-8 無 BOMweb.config 註冊 ISAPI_Rewrite 模組httpd.ini 權限規則 A 重寫到 B,規則 B 再重寫回 A。對策:善用 [L] 旗標、RewriteCond 排除已重寫路徑、或使用環境變數標記。
RewriteLog / RewriteLogLevel 診斷疑難雜症若運行於 IIS 7/8/10,強烈建議遷移至微軟官方 URL Rewrite Module 2.0:
web.config XML 規則,支援 UI 管理介面遷移工具:Import Rules 功能可直接匯入 httpd.ini。
URL 重寫是 Web 架構師的「隱形筆」,在不動後端代碼的前提下,重塑公開介面、修補歷史遺留、強化安全邊界。掌握 httpd.ini 規則撰寫與遷移策略,讓您的 IIS 應用擁有靈活、可演進的 URL 空間。