Server Side Includes (SSI) 允許在靜態 HTML 中嵌入動態指令 (檔案包含、變數輸出、條件判斷、CGI 執行結果),是輕量級動態內容技術。本文提供 IIS 5/6/7+ 及 Apache 啟用 .shtml/.shtm 副檔名對應的標準化配置步驟。
*.shtml (另建 *.shtm)C:\Windows\System32\inetsrv\ssinc.dll (IIS 6/7 共用)GET,HEAD,POST (限於安全動詞)SSI-shtml# 1. 載入模組 (通常預設已載入)
LoadModule include_module modules/mod_include.so
# 2. 設定副檔名對應
AddType text/html .shtml .shtm
AddOutputFilter INCLUDES .shtml .shtm
# 3. 目錄層級啟用 SSI (在對應 <Directory> 或 .htaccess)
Options +Includes
# 或完整寫法
Options Indexes FollowSymLinks Includes
# 4. 可選:設定 SSI 指令標籤格式 (預設 <!--# -->)
# SSIStartTag "<!--#"
# SSIEndTag "-->"
| 指令 | 語法範例 | 說明 |
|---|---|---|
| 檔案包含 | <!--#include virtual="/inc/header.html" --> | virtual 相對網站根目錄;file 相對當前檔案 (不支援跨目錄) |
| 變數輸出 | <!--#echo var="DATE_LOCAL" --> | 常用變數:DATE_LOCAL, DATE_GMT, DOCUMENT_NAME, DOCUMENT_URI, LAST_MODIFIED |
| 檔案大小/修改時間 | <!--#fsize virtual="/file.pdf" --><!--#flastmod virtual="/file.pdf" --> | 自動格式化輸出 |
| 條件判斷 | <!--#if expr="${QUERY_STRING} = /test/" -->...<!--#endif --> | 支援正則、字串比較、邏輯運算 |
| 執行 CGI/程式 | <!--#exec cmd="ls -la" --> (需 Options +ExecCGI) | 高風險,生產環境建議禁用 |
.shtml/.shtm 開啟 SSI,禁止 .html/.htm 執行 SSI (避免誤執行、效能損耗)。Options IncludesNOEXEC、IIS 確保 ssinc.dll 不處理 #exec (預設即禁用)。SSIUndefinedEcho 設定預設值)。Cache-Control: max-age=60, must-revalidate。建立 test.shtml:
<!DOCTYPE html>
<html><head><title>SSI Test</title></head><body>
<h1>SSI 測試頁面</h1>
<p>目前時間:<!--#echo var="DATE_LOCAL" --></p>
<p>檔案名稱:<!--#echo var="DOCUMENT_NAME" --></p>
<p>包含頁尾:<!--#include virtual="/inc/footer.html" --></p>
</body></html>
瀏覽 https://your-site/test.shtml,確認變數輸出與包含檔案正常顯示。
現代替代:邊緣端包含 (ESI - Edge Side Includes) 於 CDN/Varnish/Nginx 層組裝片段、前端框架 (React/Vue/Svelte) 組件化、靜態站點生成器 (Hugo/Next.js/Astro) 部分預渲染。SSI 仍適用於舊系統維護、極簡部署環境、邊緣計算節點輕量組裝場景。
Apache HTTP Server 完整配置與管理實戰指南
解決 World Wide Web Publishing 服務無法啟動的完整排查指南
IIS 6 Gzip 壓縮導致 Excel 2007 (OOXML) 下載損壞?HttpModule 延後壓縮完美解決
Userenv 1085 錯誤深度解析:IPsec 策略殘留 scripts.ini 缺失導致組策略腳本執行失敗
Ubuntu/Debian apt-get 出現「407 Proxy Authentication Required」錯誤的解決方法
CDN 加速與雙線伺服器深度對比:原理、優缺點與選型實戰指南
IIS 日誌 Timer_MinBytesPerSecond / Timer_ConnectionIdle 錯誤根因與 Metabase 修復