phpEnv中启用SSI需三步:一、取消httpd.conf中LoadModule include_module modules/mod_include.so的注释或手动添加并复制模块文件;二、在对应Directory块中配置Options +Includes、AddType text/html .shtml、AddOutputFilter INCLUDES .shtml;三、注意file路径相对当前文件、virtual路径相对网站根目录,且包含文件须有读权限。

phpEnv 默认不启用 SSI,且其 Apache 配置中 mod_include 模块常被注释或缺失 —— 直接放 <!--#include file="header.shtml" --> 会原样输出或报 500 错误,不是文件写错了,是模块根本没加载。
确认 phpEnv 的 Apache 是否已加载 mod_include
phpEnv 是 Windows 下的集成环境,其 Apache 配置路径通常为 phpEnv\Apache\conf\httpd.conf。别信“应该开了”,必须手动验证:
- 用文本编辑器打开
httpd.conf,搜索mod_include - 找到类似这行:
LoadModule include_module modules/mod_include.so;若前面有#,必须删掉 - 若整行不存在,说明 phpEnv 版本精简掉了该模块 —— 需从同版本 Apache 官方二进制包中复制
mod_include.so到phpEnv\Apache\modules\目录,并补上LoadModule行 - 保存后重启 Apache(phpEnv 控制面板里点“重启 Apache”)
让 .shtml 文件真正被解析,不是只改后缀
即使模块加载了,.shtml 默认仍当普通 HTML 返回,SSI 指令不会执行。关键在三处配置必须同时生效:
- 在
httpd.conf或虚拟主机段落中,确保目标目录启用了Options +Includes(仅Options +FollowSymLinks不够) - 添加
AddType text/html .shtml—— 缺少它,浏览器可能把文件当纯文本下载 - 添加
AddOutputFilter INCLUDES .shtml—— 这才是触发解析的开关,漏掉就等于没配 - 注意:phpEnv 的默认站点根目录通常是
phpEnv\www,<Directory>块要对应写成<Directory "D:/phpEnv/www">(路径按你实际安装位置调整)
file 和 virtual 路径写错,500 错误但日志不明显
phpEnv 的错误日志默认在 phpEnv\Apache\logs\error.log,但 unable to include 类错误有时只记一行,容易忽略。两种包含方式行为完全不同:
立即学习“PHP免费学习笔记(深入)”;
-
<!--#include file="nav.html" -->:路径是**相对于当前 .shtml 文件所在目录**,不能含../;比如当前是D:\phpEnv\www\blog\post.shtml,想包含同级的nav.html,就写file="nav.html",写file="../nav.html"必然 500 -
<!--#include virtual="/includes/footer.shtml" -->:路径是**相对于网站根目录(DocumentRoot)**,必须以/开头;比如根目录是D:\phpEnv\www,那么virtual="/includes/footer.shtml"对应的就是D:\phpEnv\www\includes\footer.shtml - 所有被包含文件都需有读权限(Windows 下一般没问题),但若你用的是 NTFS 加密或特殊安全策略,也可能静默失败
想用 .html 后缀?性能和兼容性风险得自己担
phpEnv 用户常问“能不能不改后缀”,答案是可以,但代价明确:
- 把
AddType和AddOutputFilter中的.shtml全换成.html,Apache 就会对每个.html文件做一次 SSI 解析预处理 - 这意味着所有静态 HTML 页面(哪怕不含任何 SSI 指令)都要多走一遍过滤器,CPU 和 I/O 开销上升,尤其在并发高时明显
- 某些 phpEnv 自带的示例页(如 phpinfo.html)可能因此变慢或出错,建议只对明确需要 SSI 的子目录单独配置,例如:
<Directory "D:/phpEnv/www/special"> Options +Includes AddOutputFilter INCLUDES .html </Directory>
最易被忽略的其实是空格 —— <!--#echo var="DATE_LOCAL" --> 中



















