据我了解,当服务器(例如 Apache)收到请求时,它会查找文件扩展名以找到相关的 mime 类型。然后它会查找处理此 mine 类型的处理程序(我根据向 Apache 添加 PHP 支持来说明这一点)。以下是我的问题:
- 上述说法正确吗?
- 如果是这样,当没有给定 mime 类型的处理程序时,是否意味着默认行为 - 即仅将文件发送到客户端?
- 如果甚至没有明确的扩展名 - mime 类型关联定义(例如
.html
)默认操作是否再次只是将文件发送到客户端? - 根据一些消息来源,要向 Apache 添加 PHP 支持,我们必须使用
addType
指令:AddType application/x-httpd-php .php
而其他人则说使用addHandler
指令:AddHandler application/x-httpd-php .php
在我看来,这是唯一正确的,因为addType
它只应用于静态文档。那么为什么该addType
版本仍然正确? - 我在某处发现了这样一句话:
添加类型文本/html .php .phps
添加处理程序应用程序/x-httpd-php .php
添加处理程序应用程序/x-httpd-php-source .phps
这是否意味着如果服务器找不到 application/x-httpd-php mime 类型的处理程序,则将使用 AddType 指令,并且操作只是将 .php 源文件发送到客户端,并以 text/html mime 类型作为响应?
答案1
- 是也不是。总是有一个类型和一个处理程序。如果你看看处理程序文档它指出:
通常,文件具有基于文件类型的隐式处理程序。通常,所有文件都由服务器提供,但某些文件类型需要单独“处理”。
因此,您很可能可以独立于类型配置处理程序。正如我最初的回答中所说,目前看来 PHP INSTALL 文件建议的就是这些。
如果您查看上面的链接,它将是被调用的默认处理程序,它可能只是发送文件,因为这是 Web 服务器最常见的用途。
我不明白你的意思。如果文件有扩展名,但该扩展名没有关联的 mime 类型,则使用默认 mime 类型。如果你看看帖子 如何在 Apache2 中将所有无法识别的文件类型转换为二进制文件?根据文档,默认 mime 类型应为 text/plain核心模块。
/ 原始答案:如果您正在寻找如何向 Apache 添加 PHP 支持的来源,为什么不直接查阅 PHP 下载中包含的 INSTALL 文件呢?
据此,对于 Apache 2.x 和 PHP 5.6.25,您可以使用SetHandler
。
现在如果你看一下你的例子:
添加类型文本/html .php .phps
添加处理程序应用程序/x-httpd-php .php
添加处理程序应用程序/x-httpd-php-source .phps
你是对的,根据 Apache 文档AddType
它应该用于静态文件。另一方面,使用 AddHandler 可能会带来安全风险。至少 PHP 的 INSTALL 文件不建议这样做,并且它特别提到纯 AddType 可能会导致执行实际上不是 PHP 文件的文件。从 Apache 2.x 的 INSTALL 文件第 8 点开始:
告诉 Apache 将某些扩展名解析为 PHP。例如,让我们让 Apache 将 .php 文件解析为 PHP。我们不想只使用 Apache AddType 指令,而是希望避免将潜在危险的上传和创建的文件(例如 exploit.php.jpg)作为 PHP 执行。使用此示例,您只需添加任何扩展名即可将它们解析为 PHP。我们将添加 .php 进行演示。
<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>
如果你看看文档关于AddHandler
/SetHandler
很明显 AddHandler 和 SetHandler 的用途略有不同,并且来自 INSTALL 文件的建议会“鼓励”您发送自己的标题,因为 php 文件的内部核心处理程序会发生变化。
- 不,这意味着发送给客户端的默认 mime 类型是 text/html,因为 php 文件很可能生成 html 输出。