核心路徑符號速查
| 符號 | 含義 | 解析端 | 適用對象 | 範例(虛擬目錄 /WebApp) |
~ | 應用程式根目錄 | 伺服器 | 伺服器控件屬性(ImageUrl、NavigateUrl) | ~/Images/logo.png → /WebApp/Images/logo.png |
/ | 網站根目錄 | 瀏覽器/伺服器 | 客戶端元素、伺服器控件 | /Images/logo.png → https://host/Images/logo.png |
../ | 相對目前頁面上一層 | 瀏覽器 | 客戶端元素、超連結 | 頁面在 /WebApp/Folder/page.aspx → ../other.aspx → /WebApp/other.aspx |
./ | 相對目前頁面同層 | 瀏覽器 | 客戶端元素 | ./page2.aspx |
Request.ApplicationPath | 應用程式根目錄虛擬路徑 | 伺服器 | 後台代碼拼接 URL | 虛擬目錄 → /WebApp;根站點 → / |
Server.MapPath("~") | 應用程式根目錄實體路徑 | 伺服器 | 後台讀寫檔案 | C:\inetpub\wwwroot\WebApp\ |
常見坑點與正確用法
1. 拼接 URL 動態產生
// 錯誤:ApplicationPath 可能為 "/",導致雙斜線
string url = Request.ApplicationPath + "/Images/a.gif";
// 正確:使用 VirtualPathUtility
string url = VirtualPathUtility.ToAbsolute("~/Images/a.gif");
// 或
string url = Page.ResolveUrl("~/Images/a.gif");
2. 客戶端元素 vs 伺服器控件
<img src="~/Images/x.jpg" /> ❌ 瀏覽器不認識 ~,圖片不會顯示。
<asp:Image ImageUrl="~/Images/x.jpg" /> ✅ 伺服器端解析後輸出正確 src。
3. 無 Cookie/行動裝置 Session 問題
使用 ~ 可能導致 Cookieless Session 產生新 Session ID。行動裝置專案請先 ResolveUrl 再指派:
mobileControl.ImageUrl = Page.ResolveUrl("~/Images/x.jpg");
4. 實體檔案存取
// 取得網站根目錄實體路徑
string root = Server.MapPath("~");
// 取得特定檔案實體路徑
string file = Server.MapPath("~/App_Data/data.xml");
HttpRequest 路徑屬性對照(假設請求 https://host/WebApp/Pages/Default.aspx)
| 屬性 | 回傳值 | 說明 |
| ApplicationPath | /WebApp | 應用程式根虛擬路徑 |
| FilePath | /WebApp/Pages/Default.aspx | 請求虛擬路徑(不含 QueryString) |
| CurrentExecutionFilePath | /WebApp/Pages/Default.aspx | 執行中實際檔案(Server.Transfer 後不同) |
| Path | /WebApp/Pages/Default.aspx | 同 FilePath |
| PhysicalApplicationPath | C:\inetpub\wwwroot\WebApp\ | 應用程式根實體路徑 |
| PhysicalPath | C:\inetpub\wwwroot\WebApp\Pages\Default.aspx | 請求對應實體檔案路徑 |
最佳實務原則
- 優先使用
~/ + 伺服器控件,避免硬編碼虛擬目錄名稱。
- 後台拼接 URL 用
VirtualPathUtility.ToAbsolute 或 Page.ResolveUrl。
- 實體檔案操作唯一用
Server.MapPath。
- 客戶端超連結/圖片用 網站根相對路徑
/ 或 相對路徑 ../,不依賴伺服器解析。