AddHandler 不适用于 .php 文件 - Apache 2.4

Posted

技术标签:

【中文标题】AddHandler 不适用于 .php 文件 - Apache 2.4【英文标题】:AddHandler not working for .php files - Apache 2.4 【发布时间】:2015-06-03 06:38:44 【问题描述】:

我正在为 .php 和 .html 文件创建一个名为 helloworld 的虚拟处理程序。处理程序包含以下内容:

static int helloworld_handler(request_rec *r)
    ap_rprintf(r, "hello world!");
    return OK;

我在 apache2.conf 中有这个:

<Directory /var/www/html>
AddHandler helloworld .php .html
</Directory>

处理程序“helloworld”适用于 .html 文件,但不适用于 .php 文件。我认为这主要是因为默认的 php 处理程序覆盖了 .php 文件的 helloworld 处理程序。如何使“helloworld”处理程序适用于 .php 文件?

如果需要任何额外信息,请询问。

【问题讨论】:

这个类似吗:serverfault.com/questions/593064/… 是的,它是相似的。但是那里没有正确的答案。 【参考方案1】:

您可能想改用SetHandler

<FilesMatch \.php$>
    SetHandler helloworld
</FilesMatch>

【讨论】:

这会覆盖默认的 php 处理程序。如果我在 helloworld_handler 中执行“return DECLINED”而不是“return OK”,则默认 php 处理程序不会评估 php 文件。你能告诉我如何不覆盖默认的 php 处理程序吗? 我从未尝试过,但我不明白为什么您不能同时添加第二个处理程序来将 PHP 文件发送到默认 PHP 处理程序 application/x-httpd-php5 我在问题中添加了编辑部分。你能帮忙吗? 是的,我尝试使用 SetHandler,但是文件的 php 内容没有得到评估。 我不确定这是否仍然在原始问题的范围内。我可以建议的最好的事情是查看this thread,它讨论了加载多个版本的 PHP【参考方案2】:

SetHandler 将删除任何以前设置的处理程序。要获得让您的处理程序先运行的选项,然后在您的处理程序返回 DECLINE 时运行默认的 PHP 处理程序,您需要先设置您的处理程序,然后添加 PHP

<FilesMatch \.html$>
    SetHandler helloworld .html
</FilesMatch>
<FilesMatch \.php$>
    SetHandler helloworld .php
    AddHandler php5-script .php
</FilesMatch>

请注意,这会清除之前为 .html 文件设置的所有处理程序

您只能让一个处理程序处理每个请求的任何文件类型。如果你总是希望 PHP 解释器先运行,然后你的处理程序再运行,你可以考虑 AddOutputFilter 指令。

大多数阶段由处理它们的第一个模块终止;但是,对于日志记录、“修复”和非访问身份验证检查,所有处理程序始终运行(除非出现错误)。

Apache API reference

AddOutputFilter docs

【讨论】:

【参考方案3】:

添加处理程序后,您需要重新启动 Apache 服务器。

还要检查扩展是否真的会被服务器以您希望的方式解释。您可以从托管服务提供商的系统管理员处查看此类信息。许多系统管理员禁用某些功能以提高安全性。

【讨论】:

以上是关于AddHandler 不适用于 .php 文件 - Apache 2.4的主要内容,如果未能解决你的问题,请参考以下文章

CSS不适用于包含的PHP文件

动态 PHP 变量不适用于使用 mPDF 的 codeigniter php 视图文件

PHP不适用于https,而是下载文件

重命名功能不适用于 php 中的文件夹

Vim 中超过 80 个字符的高亮行不适用于 php

根路径不适用于php include