filesmatch 是 apache 解析 php 的关键配置,通过正则匹配文件名并用 sethandler 指定处理器;必须写为 sethandler application/x-httpd-php,位置需在虚拟主机或允许的 .htaccess 中,且确保 php 模块已加载。

让 Apache 正确解析 PHP 文件,FilesMatch 是关键一环。它不负责加载 PHP 模块,而是告诉 Apache:**只要请求的文件名匹配规则,就交给 PHP 处理器执行**。写错或遗漏这一步,.php 文件会直接下载或显示源码。
基础写法(必须)
最常用、最稳妥的写法是:
<filesmatch> SetHandler application/x-httpd-php </filesmatch>
说明:
-
"\.php$"是正则表达式,\.转义点号,$表示结尾,确保只匹配以.php结尾的文件,避免误伤myphp.txt这类名字 -
SetHandler application/x-httpd-php是标准处理器名称,对应已加载的 PHP 模块(如php8apache2_4.dll或libphp.so) - 必须成对出现,不能只写开头或结尾标签
多后缀支持(常见扩展)
如果还要支持 .phtml、.php5 等旧格式,或想统一处理入口文件(如 index.php、api.php),可扩展正则:
<filesmatch> SetHandler application/x-httpd-php </filesmatch>- 注意括号外的点号要转义,竖线
|表示“或”,结尾仍需$
位置很重要:放哪儿才生效?
FilesMatch 必须放在能起作用的作用域内:
- 推荐放在虚拟主机配置块中(
<virtualhost></virtualhost>内),紧贴<directory></directory>下方或末尾 - 也可放在主配置文件
httpd.conf底部,但需确保在LoadModule php_module ...之后 - 支持写在
.htaccess中,但前提是AllowOverride允许Files类指令(如AllowOverride All或AllowOverride Options=All,Files)
配合版本切换(高级用法)
若服务器共存多个 PHP 版本(如 7.4 和 8.2),可通过不同处理器名切换:
- PHP 7.4:
SetHandler application/x-httpd-php74 - PHP 8.2:
SetHandler application/x-httpd-php82 - 需确认对应模块已加载且处理器名与系统一致(Linux 下常见为
php7/php8,Windows 下取决于 DLL 文件命名)
常见错误提醒
以下写法容易出问题,建议避开:
- 漏掉反斜杠:
"\.php$"写成".php$"→ 正则会把点号当作任意字符,匹配所有文件 - 没加结尾锚定:
"\.php"写成"\.php"→ 会匹配config.php.bak这类文件 - 只写
AddType不写SetHandler→AddType在现代模块化 PHP 中基本无效,纯属历史残留 - 放在
<location></location>块里 →FilesMatch只响应文件名,不响应 URL 路径,放错位置完全不生效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











