
Apache处理程序是指令,用于告知Apache网络服务器如何根据文件扩展名处理文件。当访客请求以 .php、.cgi 或 .pl 结尾的文件时,Apache会检查其处理程序配置,以决定哪个程序负责处理该请求并返回响应。DirectAdmin提供了简便的界面,让您无需手动编辑服务器配置文件,即可管理域名的处理程序。
什么是Apache处理程序?
处理程序本质上是文件扩展名与处理程序之间的映射关系。Apache内置了多种处理程序,同时也支持自定义处理程序。当您定义一个处理程序时,相当于告诉服务器:"当有人请求具有此扩展名的文件时,将其传递给该程序。"若没有正确的处理程序,服务器可能会将脚本的原始源代码直接发送到浏览器,而不是执行它——这既是安全风险,也会导致功能失效。
处理程序最常用于以下场景:
- 使CGI脚本(
.cgi、.pl)作为程序执行 - 将PHP文件路由到特定PHP版本或处理器
- 定义服务器端包含(SSI)的工作方式
- 处理较少见编程语言的自定义脚本类型
常见处理程序类型
cgi-script
cgi-script 处理程序告知Apache将文件作为CGI程序执行,而不是作为纯文本文件提供。此处理程序通常应用于扩展名为 .cgi 和 .pl(Perl脚本)的文件。脚本在服务器上运行,其输出结果发送到浏览器。CGI脚本必须具有可执行权限(chmod 755)才能正常工作。
php-script
在许多服务器上,php-script 处理程序(或 application/x-httpd-php 等变体)将 .php 文件映射到PHP解释器。在使用PHP-FPM或SuPHP的DirectAdmin环境中,处理程序配置可能略有不同,但概念相同——扩展名与PHP处理引擎相关联。
server-parsed
server-parsed 处理程序为扩展名为 .shtml 的文件启用服务器端包含(SSI)功能。SSI允许您在服务器端动态包含其他文件的内容,然后再将页面发送到浏览器。
如何在DirectAdmin中访问Apache处理程序
- 登录您的 DirectAdmin 控制面板。
- 在 高级功能 部分下,点击 Apache处理程序。
- 您将看到当前为您账户定义的处理程序列表,以及用于添加新处理程序的表单。
如何添加自定义处理程序
- 在Apache处理程序页面,找到页面底部的 添加处理程序 表单。
- 在 处理程序 字段中,输入处理程序名称——例如
cgi-script。 - 在 扩展名 字段中,输入您要关联的文件扩展名,例如
.cgi或.pl。您可以输入多个扩展名,用空格分隔。 - 点击 添加 保存处理程序。
- 该处理程序现在将对您账户中所有具有该扩展名的文件生效。
实用示例
启用CGI脚本(.cgi)
如果您的网络应用程序使用CGI脚本——这在旧式联系表单、计数器或论坛软件中很常见——您需要将 .cgi 映射到 cgi-script。没有此处理程序,Apache会直接提供原始脚本文本而不是执行它。添加处理程序后,请确保您的CGI文件上传到 cgi-bin 文件夹,并设置chmod 755权限。
启用Perl脚本(.pl)
以 .pl 结尾的Perl脚本同样需要 cgi-script 处理程序。操作步骤完全相同:添加处理程序 cgi-script 并设置扩展名 .pl。请确保Perl脚本的第一行包含正确的shebang路径,通常为 #!/usr/bin/perl。
自定义PHP处理
在某些配置中,您可能希望将具有非标准扩展名的文件——例如 .php7 或 .phtml——通过PHP处理器运行。您可以为 application/x-httpd-php 添加处理程序并映射到您的自定义扩展名。这在运行使用非标准PHP文件扩展名的旧版应用程序时非常有用。
如何删除处理程序
要在DirectAdmin中删除现有处理程序,请前往Apache处理程序页面,在列表中找到要删除的处理程序,点击旁边的 删除 或复选框选项,然后确认删除。处理程序将立即被删除,相关文件将恢复为服务器默认行为。
注意:服务器默认设置已正确处理PHP和常见文件类型。只有在处理CGI脚本、Perl或非标准文件扩展名时,才需要添加自定义Apache处理程序。错误地更改默认PHP处理程序可能导致网站无法正常运行——请务必先在测试环境中进行验证。
您应了解的Apache处理程序类型
Apache内置了多种处理程序,同时也支持自定义处理程序。了解每种类型将帮助您为实际需求选择正确的处理程序,并避免可能导致网站故障的配置错误。
CGI处理程序(cgi-script)
cgi-script 处理程序是您最常需要手动添加的处理程序。它指示Apache将文件作为CGI程序执行,而不是以纯文本形式提供其内容。扩展名为 .cgi 和 .pl(Perl脚本)的文件是最常见的目标。处理程序生效的前提是脚本必须具有可执行权限(chmod 755),并且通常位于 cgi-bin 目录中。
PHP处理程序(application/x-httpd-php)
在大多数共享主机服务器上,application/x-httpd-php 处理程序(或其变体)已为 .php 文件预先配置。只有当您需要将非标准扩展名(例如 .php7 或 .phtml)交由PHP引擎处理时,才需要添加自定义PHP处理程序。这偶尔用于处理使用非标准文件扩展名的旧版PHP应用程序。
SSI处理程序(server-parsed)
server-parsed 处理程序为使用 .shtml 扩展名的文件启用服务器端包含(SSI)功能。SSI允许您直接在HTML文件中嵌入指令,例如包含另一个文件的内容或显示当前日期,这些操作在页面发送到浏览器之前完成。对于简单的包含操作,它比PHP更轻量,但功能相对有限。
自定义MIME类型处理程序
对于默认情况下无法识别的特殊文件类型,您可以使用处理程序将MIME类型映射到文件扩展名。例如,将 .dat 映射到 application/octet-stream 可强制浏览器下载文件而不是直接显示。这也有助于确保API响应文件或专有格式携带正确的Content-Type头。
为不同PHP版本配置处理程序
当您的主机环境支持多个PHP版本时,处理程序配置决定哪个PHP版本处理特定的文件扩展名。这在同时运行需要PHP 7.x的旧版应用程序和针对PHP 8.x的新版应用程序时特别有用。
通过FastCGI使用PHP 7.x
在使用PHP-FPM或FastCGI的环境中,PHP 7.x的处理程序名称因服务器配置而异。它可能显示为 application/x-httpd-php7、fcgid-script 或主机提供商定义的自定义处理程序名称。请联系技术支持确认您服务器上PHP 7.x的确切处理程序字符串。使用错误的处理程序名称会导致文件以纯文本形式提供,而不是被执行。
通过FastCGI使用PHP 8.x
PHP 8.x通常是现代服务器上的默认处理程序。在DirectAdmin中,切换PHP版本的推荐方式是通过域名设置下的 PHP版本管理器——这会自动为整个域名更新处理程序。仅当您希望特定非标准扩展名(例如 .php8)也由PHP处理时,才需要手动添加PHP 8.x处理程序。
使用.htaccess进行按目录处理程序覆盖
处理程序也可以在 .htaccess 文件中使用 AddHandler 指令设置——例如 AddHandler cgi-script .cgi .pl。这种方法的优点是仅适用于包含 .htaccess 文件的目录及其子目录,不影响网站的其他部分。这非常适合在单个子目录中启用CGI,而无需更改DirectAdmin中的账户级处理程序设置。
故障排除
如果您在DirectAdmin中已正确配置处理程序,但文件仍未按预期处理,请系统地排查以下常见原因。
检查Apache错误日志
大多数处理程序问题都会产生日志记录。在DirectAdmin中,通过 统计与日志 → 错误日志 访问错误日志。常见消息包括 Options ExecCGI is off(该目录未启用CGI执行)、Premature end of script headers(脚本在输出内容之前未输出有效的HTTP头)或脚本本身存在语法问题导致的 Internal Server Error。
解决.htaccess冲突
如果目录路径中存在多个 .htaccess 文件,相互冲突的 AddHandler、RemoveHandler 或 SetHandler 指令可能会覆盖您的设置。Apache从文档根目录向下处理 .htaccess 文件,最具体(最深层)的文件中的指令优先生效。检查从域名根目录到目标目录路径上的所有 .htaccess 文件,并删除任何冲突的处理程序指令。
CGI脚本的文件权限
CGI和Perl脚本必须具有执行权限(chmod 755)。如果权限为644(其他用户只读),Apache将拒绝执行脚本,并返回403 Forbidden错误或直接提供原始脚本源代码。在测试之前,请通过DirectAdmin文件管理器或FTP客户端设置正确的权限。
验证处理程序是否已激活
在DirectAdmin中添加处理程序后,请验证它是否出现在Apache处理程序页面的列表中。然后在浏览器中使用强制刷新(Windows/Linux按Ctrl+Shift+R,Mac按Cmd+Shift+R)测试文件,以绕过任何缓存的响应。如果处理程序仍未显示为激活状态,请仔细检查您输入的扩展名是否与脚本的文件扩展名完全匹配,包括前导点号。
Apache处理程序与mod_rewrite的主要区别
开发者有时会混淆Apache处理程序和mod_rewrite规则,因为两者都可以在 .htaccess 中配置。了解它们各自在Apache请求处理流程中的位置,有助于在每种情况下选择正确的工具。
处理程序在内容生成阶段运行
Apache分多个阶段处理每个请求。处理程序在 内容生成阶段 发挥作用——此时Apache已经在磁盘上找到了文件,并确定需要提供该文件。处理程序告诉Apache:"文件已存在;现在使用此程序生成响应。"处理程序不影响URL的解析方式或文件的选择。
mod_rewrite在URL转换阶段运行
mod_rewrite介入的时间更早——在 URL转换阶段,甚至在Apache查找文件之前。它接收传入的URL,应用您的重写规则,并可以将其映射到完全不同的内部路径。例如,/about 可以被重写为 index.php?page=about,访客不会看到内部路径。mod_rewrite从不直接影响文件内容的处理方式——它只决定Apache将查找哪个文件。
选择正确的工具
- 希望
.cgi或.pl文件作为程序执行 → 使用 Apache处理程序 - 希望获得简洁的SEO友好URL,如
/blog/my-post→ 使用 mod_rewrite - 希望从URL中隐藏
.php扩展名 → 使用 mod_rewrite 去除扩展名;PHP处理程序随后正常处理文件 - 希望
.html文件由PHP解析 → 使用 Apache处理程序 为其分配PHP MIME处理程序 - 希望将旧URL永久重定向到新URL → 使用带有301标志的 mod_rewrite