核心是用SetHandler none禁用处理器绑定,使静态资源直接返回而非解析;配合Require all granted确保可读,AllowOverride None防.htaccess干扰,FilesMatch正则精准排除静态后缀。

在 Apache 的 <Directory> 块中实现简单动静分离,核心是**控制处理器绑定(Handler)和访问行为**,让静态资源跳过脚本解析、直接返回,而动态文件仍按需执行。这不是靠反向代理或外部服务,而是利用 Apache 内置的处理机制,在单目录内做精细分流。
用 SetHandler none 明确禁用脚本解析
这是最直接有效的方式。只要该目录下所有文件都不应被当作脚本执行(比如前端构建产物目录 /var/www/app/dist),就强制关闭处理器:
-
SetHandler none—— 彻底解除后缀与处理器的关联,哪怕文件名是index.php,也会被当作普通文件下载(前提是无其他覆盖规则) - 搭配
Require all granted确保可读取,避免因权限导致 403 - 无需关心文件后缀,适用于混合存放但纯静态的场景
用 AddType 和 AddHandler 精准绑定动态后缀
如果同一目录下既有静态文件,又有少量需执行的脚本(如 api.php),就不能全局禁用处理器,而要“只放行特定后缀”:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
AddHandler application/x-httpd-php .php—— 仅让.php文件交由 PHP 解析 -
AddType text/css .css、AddType application/javascript .js—— 显式声明静态类型,避免被误判为可执行内容 - 关键原则:不给
.html、.js、.png等静态后缀设置AddHandler,否则可能触发解析失败或源码泄露
配合 FilesMatch 排除关键静态路径
当目录结构较复杂,又想对某些子路径额外加固时,可用 <FilesMatch> 嵌套在 <Directory> 中:
<FilesMatch "\.(css|js|png|jpg|gif|svg|woff2?)$"> SetHandler none </FilesMatch>- 比全局
SetHandler none更灵活,保留了同目录下.php的可执行性 - 正则匹配 +
SetHandler none组合,是兼顾安全与兼容的常用做法
注意 .htaccess 的干扰风险
若该目录允许 .htaccess,而其中包含重写规则(如 Laravel 的 index.php 入口转发),很可能把 /style.css 也重写进 PHP,导致乱码或 500 错误。应在 <Directory> 块中显式压制:
-
AllowOverride None—— 完全禁用 .htaccess,最稳妥 - 或保留部分覆盖但加防护:
AllowOverride FileInfo Options,并确保 .htaccess 开头有存在性判断:RewriteCond %{REQUEST_FILENAME} -f+RewriteRule ^ - [L]

















