將 IIS 網站的特定網址導向其他網址,有幾種做法:

  1. UrlRewrite 模組
    彈性高,支援複雜的轉換規則(可使用 Regular Expression 定義規則),能在使用者未察覺的情況下完成轉換,例如將 /product/book/computer 轉為 /product.aspx?zone=book&catg=computer,提供較友善的網址並增進 SEO。
    但若轉址是因為網站或網頁搬家,需明白告知並建議使用者改用新網址,UrlRewrite 較不適用。
  2. JavaScript 或 HTML 標籤轉址
    在舊網頁加上 location.href = "新網址" 或 <meta http-equiv="refresh" content="0;url=新網址" /> 將使用者導向新網址。缺點是每個舊址要留一個 HTML,瀏覽器需耗消資源載入 DOM 才執行轉址,也未明確告知客戶端應改用新址。
  3. 伺服器端轉址
    即在 ASP.NET 呼叫 Response.Redirect() 或在 ASP.NET MVC return Redirect() / RedirectPermanet()。
    原理是回傳 HTTP 301/302 告知瀏覽器永久或暫時改用新址。301 是宣告舊址作廢以後請改用新址,搜索引擎下回建立索引及計算排名時會以新址取代舊址;302 則是暫時改用新址,未來每次會先回舊址再轉向新址。HTTP 1.1 增加的 308/307 類似 301/302,差別在於只對 GET 導向,POST 時仍回舊址避免回傳資料遺失。
    參考:HTTP Redirect 301, 302 區別及對SEO的影響 @ 符碼記憶 
    參考:MDN HTTP Response Status Codes
  4. IIS HTTP 重新導向模組
    效果同伺服器端轉址,好處是只需設定 web.config 不用寫成網頁,且一條設定即可適用整個子目錄。

來看看 HTTP 重新導向怎麼設定。使用前需先確定 IIS 有安裝 HTTP 重新導向(HTTP Redirection):

接著在 IIS 管理員中找到要導向的資料夾進行設定:

套用設定後,IIS 會在該資料夾建立如下的 web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="/NewPlace" 
          exactDestination="false" childOnly="true" httpResponseStatus="Found" />
    </system.webServer>
</configuration>

關於設定介面中的選項,我用以下的資料夾結構示範,假設我們在 Moved 指定重新導向 /NewPlace。

 

  • 將所有要求重新導向至確切的目的地(而非目的地相對位置)
    exactDestination="true/false"
    勾選時,/Moved/test.html、/Move/SubFolder/test.html 都會被導向 /NewPlace
    如未勾選,/Moved/test.html 導向 /NewPlace/test.html、/Move/SubFolder/test.html 導向 /NewPlace/SubFolder/test.html
  • 只將要求重新導向至此目錄(不是子目錄)中的內容
    childOnly="true/false"
    勾選時,只有 /Moved/test.html 會被導向新址,更下一層子目錄的 /Move/SubFolder/test.html 不會被導向仍可瀏覽

除了透過 IIS 管理介面,我們也可直接修改 web.config 設定重新導向規則,<httpRecdirect> 參數選項可參考官方文件:HTTP Redirects -httpRedirect- - Microsoft Docs 另外,<httpRedirect> 還有一些進階應用,例如:ASP 升級 ASPX 時,將所有 *.asp 導向首頁。參考

以上的做法有個小缺點 - 必須為舊網址建立資料夾放置 web.config,雖然視覺化顯示哪些地方存在舊網址避免誤用是好事,但如果你不喜歡新專案冒出一堆無用資料夾,可以試試這招 - 在根目錄的 web.config 中用 <location path="舊址"> 包覆 <httpRedirect> 宣告,就不必實際建立資料夾或檔案也能針對特定路徑進行轉址。

  <location path="Moved">
    <system.webServer>
      <httpRedirect enabled="true" destination="/NewPlace" />
    </system.webServer>
  </location>

A study of how to use IIS to implement HTTP redirection, including: UrlRewrite, JS or http-equiv="refresh", Reponse.Redirect() and HTTP redirection module.


Comments

Be the first to post a comment

Post a comment