<p>Nginx可通过SSI在静态HTML中嵌入动态内容,需启用ssi模块、配置ssi on及ssi_types,并用<!--# ... -->语法调用echo、include等指令;file读磁盘文件,virtual发起内部子请求,后者须配合internal location实现动态接口嵌入。</p>

Nginx 本身不执行服务端脚本(如 PHP),但可以通过 SSI(Server Side Includes)在静态 HTML 中“插入”动态内容,比如当前时间、文件内容、环境变量,甚至代理其他后端响应。关键在于 Nginx 需要启用 SSI 模块并正确配置,且 HTML 文件需以特定方式标记和响应。
启用 SSI 并设置响应头
SSI 默认不生效,必须显式开启。在 location 块中添加以下指令:
- ssi on; — 启用 SSI 解析
- ssi_silent_errors off; — 出错时显示提示(开发阶段建议开启)
- ssi_types text/html; — 指定哪些 MIME 类型允许解析 SSI(默认只处理 text/html,若用 .shtml 可省略)
- add_header Content-Type "text/html; charset=utf-8"; — 确保浏览器正确识别编码(尤其含中文时)
HTML 中使用标准 SSI 语法
在 HTML 文件中用 <!--# ... --> 注释语法嵌入指令。常见用法有:
- <!--# echo var="DATE_LOCAL" --> — 输出本地时间
- <!--# include file="header.html" --> — 包含同目录下的静态文件(相对路径)
- <!--# include virtual="/api/status" --> — 通过 internal location 代理请求(需配合 upstream 或 proxy_pass)
- <!--# set var="name" value="nginx" --><!--# echo var="name" --> — 定义并输出变量
注意:file 是读取磁盘文件,virtual 是发起一次内部子请求(可指向另一个 location),后者更常用于嵌入动态接口返回内容。
立即学习“前端免费学习笔记(深入)”;
配合 internal location 实现动态嵌入
想把后端 API 的 JSON 或纯文本结果直接嵌入 HTML?不能直接 include virtual="/api/data",除非该 location 被声明为 internal,且返回 plain/text 或 text/html:
- 定义一个 internal 接口 location:
location = /api/time {
internal;
proxy_pass http://127.0.0.1:8000/time; # 或用 return 指令模拟
} - 在 HTML 中调用:<!--# include virtual="/api/time" -->
- 确保后端响应头不含
Content-Encoding: gzip(SSI 不解压),且Content-Type在ssi_types列表中
注意事项与常见问题
SSI 是轻量级方案,适合简单场景,但有明确限制:
- 不支持条件判断(如 if/else)、循环等逻辑 —— 若需复杂控制,应换用模板引擎或服务端渲染
- 文件包含(
file)路径基于 document_root,不能跨目录(../会被拒绝) - 嵌入内容不会被缓存(除非整个页面被缓存且 SSI 已解析完成),但子请求本身可单独配置缓存
- 调试时查看 Nginx error log,常见错误如 “SSI include not found”、“no suitable filter” 多因 MIME 类型不匹配或未开启 ssi


















