xampp默认禁用ssi,需手动启用mod_include模块并配置options+includes、addtype和addoutputfilter,且file与virtual路径规则严格区分:file为当前目录相对路径,virtual为根目录绝对路径。

XAMPP 默认完全禁用 SSI,哪怕你写了 <!--#include file="header.html" -->,浏览器也只会原样显示这行注释,或直接返回 500 错误。核心就两点:模块没加载、文件没被识别为可解析 SSI 的类型。
确认并启用 mod_include 模块
Windows 下 XAMPP 自带 mod_include.so,但它被默认注释掉了。不手动打开,SSI 就永远不工作。
- 打开
\xampp\apache\conf\httpd.conf - 搜索
include_module,找到这行:#LoadModule include_module modules/mod_include.so - 删掉开头的
#,保存文件 - 在 XAMPP 控制面板中点击 Stop 再 Start Apache(仅重启不够,必须 stop+start)
- 验证是否生效:命令行运行
xampp\apache\bin\httpd.exe -M | findstr include,输出含include_module即成功
让 .shtml 文件真正执行 SSI
模块开了 ≠ 文件能解析。Apache 默认对任何后缀都不做 SSI 处理,必须显式声明哪些文件类型要交给 mod_include 处理。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 仍在
httpd.conf中,找到<directory></directory>这类区块(路径以你实际 DocumentRoot 为准) - 确保该区块内包含这三行,且都在同一作用域下(不能一个在
<directory></directory>里,一个在<virtualhost></virtualhost>外):Options +IncludesAddType text/html .shtmlAddOutputFilter INCLUDES .shtml -
Options +Includes是硬性开关,漏掉它,其他两行无效 - 改完必须重启 Apache
- 测试文件必须命名为
test.shtml,访问http://localhost/test.shtml才会触发解析
file 和 virtual 路径写法必须严格区分
写错路径是导致 500 错误最常见原因,Apache 日志里会明确报 unable to include,但浏览器只给空白或原始注释。
-
<!--#include file="nav.shtml" -->:路径是**相对于当前文件所在目录**,不支持../,也不能以/开头。例如当前页是/blog/post.shtml,要包含同目录的nav.shtml,就写file="nav.shtml" -
<!--#include virtual="/includes/footer.shtml" -->:路径是**相对于网站根目录(DocumentRoot)**,必须以/开头。目标文件必须放在\xampp\htdocs\includes\footer.shtml这类可被 Web 直接访问的位置 -
file="../header.html"在 XAMPP 下必报错;virtual="footer.shtml"(缺开头/)会静默失败或 500 - 被包含文件需有读取权限(
chmod 644),Windows 下注意文件是否被标记为“只读”
调试时别看浏览器,直接查 Apache 错误日志
SSI 失败几乎从不给友好提示。浏览器显示空白、原始注释、或模糊的 500,真正线索全在日志里。
- 日志路径通常是
\xampp\apache\logs\error.log - 出错时,里面会明确出现类似:
[warn] [client 127.0.0.1] unable to include "header.html" in parsed file或Permission denied - 同时检查响应头:用浏览器开发者工具 Network 标签,看
Content-Type是否为text/html—— 如果是application/octet-stream,说明AddType没生效 - 路径权限、SELinux(Linux 环境)、甚至中文路径编码问题,都会在这里暴露
最容易被忽略的是 Options +Includes 和 AddOutputFilter 必须在同一个作用域内,以及 file 路径绝对不允许向上跳转。这两点一旦出错,Apache 不会报错,而是直接跳过解析,页面就变成纯静态 HTML。










