SSI(Server Side Includes)是一種輕量級伺服器端模板技術,通過 HTML 註釋指令實現頁面片段復用、動態資訊顯示、腳本執行等功能。無需編程語言支援,極適合靜態站點快速構建、維護成本控制。本文詳述 Apache 下 SSI 啟用全流程、配置差異與最佳實踐。
<!--#include virtual="/header.html" -->:跨目錄引入公共片段(導航、頁腳)<!--#echo var="DATE_LOCAL" -->:動態顯示伺服器時間<!--#exec cmd="ls -la" -->:執行 Shell 命令(需謹慎開啟)<!--#fsize file="image.jpg" -->:顯示文件大小<!--#config timefmt="%Y-%m-%d" -->:自定義輸出格式httpd.conf(或 apache2.conf),確保載入模組:
LoadModule include_module modules/mod_include.so
<Directory> 區塊啟用 Includes 選項:
<Directory "/var/www/html">
Options Indexes FollowSymLinks Includes
AllowOverride None
Require all granted
</Directory>
Options IncludesNOEXECOptions Includes ExecCGI + AddHandler cgi-script .cgi .pl .sh.shtml 區分動靜):
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
systemctl reload httpd 或 apachectl graceful在目標目錄創建 .htaccess:
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
# 可選:強制 .html 也解析 SSI(效能較差,不建議全站開啟)
# AddType text/html .html
# AddOutputFilter INCLUDES .html
⚠️ 需主配置允許 AllowOverride Options FileInfo。
| 策略 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| .shtml 專用 | 靜態 .html 直通輸出,零解析開銷;語義清晰 | 需重命名現有文件,鏈接需更新 | 新專案、靜態頁面佔多數、極致效能要求 |
| .html 全解析 | 無需改動現有鏈接,平滑遷移 | 所有 HTML 經解析器,CPU 開銷增 10-30% | 舊站改造、SSI 滲透率高、可接受效能折損 |
| 混合模式 | 核心頁面 .shtml,邊緣頁 .html + 選擇性解析 | 配置複雜,易誤判 | 大型存量站點分階段遷移 |
IncludesNOEXEC,防止 <!--#exec cmd="rm -rf /" --> 類攻擊。virtual 參數禁止 ../ 穿越,file 參數僅限當前目錄下文件。<!--#include virtual="/user/$_GET[page]" -->),**嚴格白名單驗證**,防止任意文件讀取(LFI)。<!--#config errmsg="[SSI Error]" --> 避免洩露路徑結構。mod_expires、mod_headers 為靜態片段設置長期緩存。XBitHack on:僅對執行位設置的文件解析 SSI(chmod +x page.shtml),進一步減少解析開銷。# 測試 SSI 是否生效
echo '<!--#echo var="DATE_LOCAL" -->' > test.shtml
curl https://localhost/test.shtml
# 輸出包含當前時間即成功
查看錯誤日誌:tail -f /var/log/httpd/error_log | grep -i ssi