Apache不提供独立“静态资源定义”类型,但可通过Include指令按站点拆分并统一加载Alias、ExpiresByType、SetHandler等静态策略,实现路径隔离、缓存分级与执行禁止。

Apache 本身不提供“静态资源定义”的独立配置类型,但可以通过 Include 指令批量引入针对不同站点的 静态资源路径映射、访问控制或性能优化规则,核心是把静态资源服务逻辑(如 Alias、<directory></directory>、ExpiresByType 等)按站点拆分成独立文件,再统一加载。
明确目标:用 Include 管理各站点静态资源策略
所谓“静态资源定义”,实际指对 CSS/JS/图片等文件的处理方式:是否启用缓存、是否禁止执行、是否设置 MIME 类型、是否限制访问等。这些规则应按站点隔离,避免互相干扰。使用 Include 可让主配置简洁,且新增站点时只需加一个文件,无需修改主配置。
步骤一:规划站点静态资源配置目录结构
在 Apache 配置目录下(如 /etc/apache2/sites-available/ 或 /usr/local/apache2/conf/extra/)创建专用子目录:
-
static-rules/—— 存放所有站点的静态资源规则文件,例如:site-a-static.confsite-b-static.confcommon-static.conf(通用规则,如全局缓存头) - 每个文件只包含与该站点静态资源相关的配置块,不写
VirtualHost容器,只写内部指令
步骤二:为单个站点编写静态资源规则文件
以 site-a-static.conf 为例,内容聚焦静态行为:
# /etc/apache2/static-rules/site-a-static.conf
<location>
Require all granted
SetHandler none
</location><p><directory>
Require all granted
SetHandler none
<ifmodule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType text/css "access plus 1 week"
ExpiresByType application/javascript "access plus 1 week"
</ifmodule></directory></p><h1>禁止解析静态目录下的脚本</h1><p><filesmatch>
Require all denied
</filesmatch></p>
注意:
– SetHandler none 是关键,确保该路径下所有文件(哪怕叫 xxx.php)都当作普通文件返回或下载;
– 所有路径需真实存在,且 Apache 进程有读取权限;
– 不要在此类文件中写 DocumentRoot 或 ServerName,那是虚拟主机层的事。
步骤三:在虚拟主机配置中引入对应规则
编辑站点的 VirtualHost 块(如 /etc/apache2/sites-enabled/site-a.conf),在 <virtualhost></virtualhost> 内部合适位置加入:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
<virtualhost>
ServerName site-a.example.com
DocumentRoot /var/www/site-a/public
<pre class="brush:php;toolbar:false;"># 引入该站点专属静态规则
Include /etc/apache2/static-rules/site-a-static.conf
# 其他动态路由、重写等配置...
同理,site-b.conf 中写 Include /etc/apache2/static-rules/site-b-static.conf。这样每个站点的静态策略完全解耦。
步骤四:启用并验证
确认 mod_alias、mod_expires、mod_headers 等模块已启用(尤其 SetHandler 和缓存依赖它们);运行语法检查:
apachectl -t
若无报错,重启服务:systemctl restart apache2(或 httpd)。可通过访问 https://site-a.example.com/static/test.png 并检查响应头中的 Cache-Control 或尝试请求 /static/bad.php 是否被下载(而非执行)来验证规则生效。










