一、SSI 是什么
SSI(Server Side Includes,服务器端包含)是一种简单的服务器端脚本技术,允许在 HTML 页面(通常以 .shtml 为扩展名)中嵌入指令,Apache 服务器在返回页面给客户端前会解析这些指令并执行相应操作(如包含其他文件、执行系统命令、显示服务器信息等)。启用 SSI 解析后,.shtml 文件中的 SSI 标签才能被 Apache 正确识别和执行。
二、实验步骤
1. 启用必要模块
SSI 的核心解析依赖 mod_include 模块,若需使用 #exec 指令执行系统命令或 CGI 脚本,还需启用 mod_cgi 模块。执行以下命令启用模块:
# 启用 SSI 核心解析模块
sudo a2enmod include
# 启用 CGI 执行模块(如需使用 #exec 指令则必须启用)
sudo a2enmod cgi
2. 修改站点配置文件
编辑 Apache 虚拟主机配置文件(默认路径为 /etc/apache2/sites-available/000-default.conf,若为自定义站点则修改对应配置文件),在 <Directory> 段落中添加 SSI 解析相关配置,核心配置如下:
<Directory /var/www/html>
# 启用必要选项:Includes 支持 SSI 解析,ExecCGI 支持 #exec 指令执行 CGI/命令
Options +Indexes +FollowSymLinks +Includes +ExecCGI
# 将 .shtml 扩展名关联到 text/html 类型,确保浏览器正确解析
AddType text/html .shtml
# 为 .shtml 文件添加 INCLUDES 输出过滤器,触发 Apache 解析 SSI 标签
AddOutputFilter INCLUDES .shtml
# (可选) 将 index.shtml 加入默认首页列表,优先加载 .shtml 首页
DirectoryIndex index.shtml index.html
AllowOverride All
Require all granted
</Directory>
配置说明:
Options +Includes:是启用 SSI 解析的核心选项,缺失则 Apache 不会处理.shtml中的 SSI 指令;AddOutputFilter INCLUDES .shtml:明确指定对.shtml文件应用 SSI 过滤解析,是确保 SSI 生效的关键;- 若无需执行
#exec指令,可移除+ExecCGI以提升安全性。
3. 调整全局 SSI 安全策略(可选)
Apache 全局 SSI 配置文件 /etc/apache2/mods-available/include.conf 可能限制 #exec 指令执行,需检查并调整:
<IfModule mod_include.c>
# 注意:若此处为 IncludesNoExec,会禁止 #exec 指令,需改为 Includes(或直接注释)
# XBitHack full:通过文件可执行权限控制 SSI 行为,full 表示只要文件有可执行权限就解析 SSI
XBitHack full
</IfModule>
关键说明:
IncludesNoExec是安全限制选项,会禁用#exec指令,仅保留文件包含等基础 SSI 功能;XBitHack full:开启后,即使未在站点配置中显式启用Includes,只要.shtml文件设置了可执行权限(如chmod +x test.shtml),Apache 也会解析其内部的 SSI 指令。
4. 重启服务并验证配置
修改 Apache 配置后,必须重启服务使配置生效:
sudo systemctl restart apache2
# 可选:检查配置是否有语法错误,避免重启失败
sudo apache2ctl configtest
测试 SSI 是否生效
- 在
/var/www/html目录下创建测试文件test.shtml:
<!DOCTYPE html>
<html>
<head>
<title>SSI 测试</title>
</head>
<body>
<h1>SSI 解析测试</h1>
<!-- SSI 指令:显示当前时间 -->
<p>服务器当前时间:<!--#echo var="DATE_LOCAL" --></p>
<!-- SSI 指令:显示服务器 IP 地址(可选) -->
<p>服务器 IP:<!--#echo var="SERVER_ADDR" --></p>
<!-- 若启用了 ExecCGI,可测试 #exec 指令(示例:执行 ls 命令) -->
<!-- <p>目录文件列表:<!--#exec cmd="ls /var/www/html" --></p> -->
</body>
</html>
- 访问
http://服务器IP/test.shtml,若页面显示服务器时间、IP 等信息,说明 SSI 解析已成功启用;若仅显示原始 SSI 标签,则配置未生效,需检查上述步骤。
三、注意事项
- 安全性:
#exec指令可执行系统命令,存在安全风险,非必要场景建议禁用mod_cgi或设置Options IncludesNoExec; - 权限:确保
.shtml文件所属用户/组对 Apache 进程(通常为www-data)有可读权限; - 扩展名:若需让
.html文件也支持 SSI,可在配置中添加AddOutputFilter INCLUDES .html,但不建议(易增加解析开销)。
总结
- 启用 SSI 核心依赖
mod_include模块,mod_cgi仅在使用#exec指令时需要; - 站点配置中需通过
Options +Includes和AddOutputFilter INCLUDES .shtml开启.shtml解析; - 配置修改后需重启 Apache 并通过测试文件验证 SSI 指令是否正常解析,同时注意控制
#exec指令的使用以保障服务器安全。
原文 https://blog.csdn.net/2301_79518550/article/details/158126358