在 Java Web 專案中,路徑問題經常導致資源找不到、重導向錯誤等困擾。搞清楚相對路徑與絕對路徑的解析規則,是避免坑的關鍵。
相對路徑不以 / 開頭,例如 page.jsp、../css/style.css。其基準是「當前請求的資源位置」。然而,當發生請求轉發時,基準會改變,導致同一段相對路徑在不同情境下指向不同資源,因此不建議在轉發鏈中使用相對路徑。
/ 開頭,解析端不同含義不同絕對路徑以 / 開頭,但含義取決於誰在解析:
| 解析端 | / 代表 | 典型場景 |
|---|---|---|
| 瀏覽器 | 當前伺服器主機根目錄(https://host:port/) | response.sendRedirect() 重導向、<a href>、<form action>、JS/AJAX 請求 URL |
| 伺服器端 | 當前 Web 應用根目錄(https://host:port/contextPath/,即 WebContent) | RequestDispatcher.forward() 轉發、web.xml 的 url-pattern、@WebServlet 路徑、JSP <jsp:include> |
口訣:瀏覽器看主機,伺服器看應用。
<base> 標籤:統一全頁相對路徑基準在 <head> 中宣告 <base href="..." />,可為整份 HTML 文件的所有相對路徑(連結、圖片、表單、腳本等)指定統一基準。
<base href="https://${pageContext.request.serverName}:${pageContext.request.serverPort}${pageContext.request.contextPath}/" />
等同於手動拼裝:
request.getProtocol()(如 HTTP/1.1)request.getServerName()request.getServerPort()request.getContextPath()<base> 使用四大注意事項<base href="https://主機地址/Web應用虛擬路徑/" />,結尾必須有 /。<head> 內部,且位於所有使用相對路徑的標籤之前。/ 或完整 URL 開頭)不受影響。#id)也會以 base 為基準,若需跳回當前頁錨點,請使用完整 URL 或 JS 處理。forward)一律使用以 / 開頭的絕對路徑(相對於 contextPath)。redirect)建議使用完整路徑(含 contextPath),或搭配 <base> 使用相對路徑。${pageContext.request.contextPath}/resource/path 或 <base> 統一管理。