在傳統 ASP 開發中,Response.Redirect 是最常見的頁面跳轉方式,但它屬於客戶端重導向:伺服器回傳 HTTP 302 狀態碼與新 URL,瀏覽器再發起第二次請求。這不僅增加網路延遲,還會導致 QueryString 參數遺失、Session 在某些情境下中斷等問題。
IIS 5.0(Windows 2000)提供 Server.Transfer 與 Server.Execute,兩者均在伺服器端完成處理,瀏覽器 URL 不變、無額外往返,可節省頻寬並保留原頁面的 Request、Response、Session、Application 等內建物件內容。
<%
Response.Write "File 1 Header<br>"
Server.Transfer "file2.asp"
Response.Write "File 1 Footer<br>" ' 永不執行
%>
行為: 遇到 Transfer 即終止當前頁面執行,控制權永久移交目標頁面。
輸出結果: File 1 Header + file2.asp 的全部輸出。
<%
Response.Write "File 1 Header<br>"
Server.Execute "file2.asp"
Response.Write "File 1 Footer<br>" ' 繼續執行
%>
行為: 暫停當前頁面,執行目標頁面,完成後返回繼續執行後續程式碼。
輸出結果: File 1 Header + file2.asp 輸出 + File 1 Footer。
Execute 可能導致堆疊深度過大,建議評估改用 Server.Transfer 或重構為 User Control / Master Page 架構(ASP.NET)。Session、Application 或 Context.Items(ASP.NET),避免 QueryString 長度限制。| 場景 | 建議方法 | 理由 |
|---|---|---|
| 權限檢查失敗,導向登入頁且不需返回 | Server.Transfer | 終止原流程,避免使用者透過「上一頁」繞過驗證 |
| 共用頁首/頁尾、動態組裝區塊 | Server.Execute | 類似 Include/Partial View,保持主流程控制權 |
| 跨應用程式/虛擬目錄跳轉 | Response.Redirect | Server 方法不支援跨應用程式邊界 |
| 需保留瀏覽器網址列顯示原 URL | Server.Transfer / Execute | 屬伺服器端處理,URL 不變 |
注意: ASP.NET 建議改用Server.TransferRequest(整合管線模式)或HttpContext.RewritePath,傳統Transfer/Execute在整合模式下可能引發模組事件重複觸發問題。