启用mod_include需三步:加载模块、配置文件类型解析、设置目录options+includes;file路径相对当前目录,virtual路径相对网站根目录;禁用exec以防rce漏洞。
apache启用mod_include(ssi)不是“开个开关”就能用,而是必须完成三件关键事情:加载模块、声明哪些文件要解析、赋予目录执行权限。缺一不可,否则<!--#include file="header.html" -->只会原样显示,或直接返回500错误。
启用mod_include模块
Windows下XAMPP、phpEnv等集成环境默认注释掉该模块;Linux用a2enmod include可一键启用,但手动配置更可控。
- 打开
httpd.conf,搜索include_module - 找到这行:
#LoadModule include_module modules/mod_include.so,删掉开头的# - 保存后必须完全停止再启动Apache(仅“Restart”可能不生效)
- 验证是否成功:命令行运行
httpd -M | findstr include(Windows)或httpd -M | grep include(Linux),输出含include_module即通过
指定哪些文件类型触发SSI解析
模块加载 ≠ 文件被处理。Apache默认对任何后缀都不做SSI解析,必须显式告诉它:“遇到.shtm/.shtml/.html就交给mod_include处理”。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在
httpd.conf中找到<directory></directory>区块(如<directory></directory>) - 确保该区块内包含以下三行(顺序不限,但必须在同一作用域):
-
AddType text/html .shtml .html(让浏览器正确识别为HTML) -
AddOutputFilter INCLUDES .shtml .html(真正触发SSI解析的核心指令) -
Options +Includes(或Options FollowSymLinks Includes)
-
- 若只想对特定扩展启用,例如只支持
.shtml,则写成AddType text/html .shtml和AddOutputFilter INCLUDES .shtml
正确使用include指令:file与virtual路径规则
路径写错是500错误最常见原因,且错误日志往往提示模糊。两种写法行为完全不同,不能混用。
-
<!--#include file="nav.html" -->:路径是相对于当前文件所在目录,不能以/开头,也不能含../。例如当前是/blog/post.shtml,想包含同级的nav.html,就写file="nav.html" -
<!--#include virtual="/includes/footer.shtml" -->:路径是相对于网站根目录(DocumentRoot),必须以/开头。例如根目录是C:/xampp/htdocs,那么virtual="/includes/footer.shtml"实际指向C:/xampp/htdocs/includes/footer.shtml - 被包含的文件需有读取权限,且不能是PHP等已由其他模块处理的类型(除非额外配置)
安全提醒:禁用危险的exec功能
SSI支持#exec cmd执行系统命令,一旦开放且页面内容可被用户提交(如评论区),极易导致远程代码执行漏洞。
- 务必在
Options中使用IncludesNOEXEC替代Includes,例如:Options FollowSymLinks IncludesNOEXEC - 这样仍可正常使用
include、echo、if等安全指令,但#exec会被拒绝 - 如确需执行CGI,应单独启用
mod_cgi并严格限制路径与权限,而非依赖SSI










