我能找到的一些历史

我能找到的一些历史

我的理解是:

  • AddHandler- 对于服务器
  • AddType- 对于客户端(浏览器)
AddType application/x-httpd-php4 .php4
AddHandler application/x-httpd-php4 .php4

但是为什么我们需要添加两者? 如果是 PHP,是否需要添加两者? 如果AddType是 PHP,是否需要添加两者?

答案1

在您的情况下,内容类型等于处理程序的名称只是巧合 - 假设实际上有一个名为的处理程序application/x-httpd-php4。否则,这完全是错误的。

答案2

正如有人所说:

  1. AddType用于将文件扩展名与 MIME 类型关联(从而更改content-typeHTTP 响应标头)
  2. AddHandler/SetHandler用于将文件扩展名绑定到服务器端处理程序(如 PHP)。

似乎使用AddType绑定 PHP 处理程序是一种过时的方法,在 Apache 1.1.0 之前使用AddHandler/SetHandler引入。

我能找到的一些历史

Apache 1.0.x 中没有AddHandler/SetHandler

https://svn.apache.org/repos/asf/httpd/httpd/tags/1.3/apache_1_0_0/src/modules/standard/mod_mime.c包含:

command_rec mime_cmds[] = {
{ "AddType", add_type, NULL, OR_FILEINFO, ITERATE2,
    "a mime type followed by one or more file extensions" },
{ "AddEncoding", add_encoding, NULL, OR_FILEINFO, ITERATE2,
    "an encoding (e.g., gzip), followed by one or more file extensions" },
{ "AddLanguage", add_language, NULL, OR_FILEINFO, ITERATE2,
    "a language (e.g., fr), followed by one or more file extensions" },
{ "TypesConfig", set_types_config, NULL, RSRC_CONF, TAKE1,
    "the MIME types config file" },
{ NULL }
};

1996 年 4 月

PHP/FI(PHP 2.0)介绍了PHP 的 Apache 模块版本。当时Apache的官方发布版本是1.0.5。

自述文件来自https://museum.php.net/php2/php-1.99s.tar.gz包含:

Step 4. (If you are NOT installing the Apache module version)
  
  Copy the php.cgi binary to your system's cgi-bin directory.  If you
  do not have access to do this and wish to install it in your own
  personal directory, you may do so, but you should set the setuid
  bit on the executable with: chmod u+s /path/php.cgi
  Setting the setuid bit is not crucial.  The benefit is that any files
  created by php will be owned by you.  This means that you can edit
  and delete such files directly.  Without the setuid bit set these
  files will be owned by the httpd user id.

Step 4. (if you are installing the Apache module version)

  Change to your Apache src directory where the mod_php.c and mod_php.h
  files should have been copied to. If they weren't which usually happens
  because of permission problems, copy these two files there manually. Edit
  your Apache Configuration file and add the EXTRA_LIBS line which was
  produced at the end of Step 3. And add:

    Module php_module mod_php.o

  to the very end of the file. Then type: ./Configure and then make to rebuild
  your Apache httpd binary. Install this binary.

  Next you need to edit your Apache conf/srm.conf file and add a line like:

    AddType application/x-httpd-php .phtml

  This defines a new MIME, application/x-httpd-php, which will trigger the
  PHP module to parse any file ending with the .phtml extension. You can pick
  any extension you like for this.

  Now you are ready to restar your httpd server. See the Apache Module
  Notes for more details on configuring the PHP Module.

src/mod_php.c 来​​自https://museum.php.net/php2/php-1.99s.tar.gz包含:

handler_rec php_handlers[] = {
        { "application/x-httpd-php", send_parsed_php },
        { NULL }
};

module php_module = {
        STANDARD_MODULE_STUFF,
        NULL,                           /* initializer */
        php_create_conf,        /* dir config creater */
        NULL,                           /* dir merger --- default is to override */
        NULL,                           /* server config */
        NULL,                           /* merge server config */
        php_commands,           /* command table */
        php_handlers,           /* handlers */
        NULL,                           /* filename translation */
        NULL,                           /* check_user_id */
        NULL,                           /* check auth */
        NULL,                           /* check access */
        NULL,                           /* type_checker */
        NULL,                           /* fixups */
        NULL                            /* logger */
};

1996 年 7 月

AddHandler/SetHandler 被引入在 Apache 1.1.0 中。

https://svn.apache.org/repos/asf/httpd/httpd/tags/1.3/APACHE_1_1_0/src/CHANGES包含:

  *) Add AddHandler command, which allows content-type-independent
     "handlers" to be defined for file extensions. These can be either
     built into Apache (such as CGI scripts or server-side includes, or
     added with the Action command). [Alexei Kosut]

https://svn.apache.org/repos/asf/httpd/httpd/tags/1.3/APACHE_1_1_0/src/modules/standard/mod_mime.c包含:

command_rec mime_cmds[] = {
{ "AddType", add_type, NULL, OR_FILEINFO, ITERATE2,
    "a mime type followed by one or more file extensions" },
{ "AddEncoding", add_encoding, NULL, OR_FILEINFO, ITERATE2,
    "an encoding (e.g., gzip), followed by one or more file extensions" },
{ "AddLanguage", add_language, NULL, OR_FILEINFO, ITERATE2,
    "a language (e.g., fr), followed by one or more file extensions" },
{ "AddHandler", add_handler, NULL, OR_FILEINFO, ITERATE2,
    "a handler name followed by one or more file extensions" },
{ "ForceType", set_string_slot, (void*)XtOffsetOf(mime_dir_config, type),
    OR_FILEINFO, TAKE1, "a media type" },
{ "SetHandler", set_string_slot, (void*)XtOffsetOf(mime_dir_config, handler),
    OR_FILEINFO, TAKE1, "a handler name" },
{ "TypesConfig", set_types_config, NULL, RSRC_CONF, TAKE1,
    "the MIME types config file" },
{ NULL }
};

2004 年 12 月

Rasmus Lerdorf 说

就像大多数类似的批评一样,他们根本不会费心去研究为什么某些事情会是这样的。曾经有一段时间没有 AddHandler 指令。Addtype 是你实现这个功能的方式。由于 AddType 适用于每个版本的 Apache,因此即使在添加了 AddHandler 之后,我也从未发现有理由改变这一点,因为它纯粹是学术性的。

也可以看看https://bugs.php.net/bug.php?id=36772

2008 年 6 月

AddType 被取代SetHandlerAddHandlerApache 2.x 的 PHP 安装指南为了安全原因

也可以看看https://www.php.net/manual/en/install.unix.apache2.php#92797

附言:但是Apache 1.3.x 的 PHP 安装指南仍然包含AddType(并且它似乎也已经过时了)。

答案3

似乎存在很多令人困惑的地方,并且上面的关于 mod_php 的答案甚至是错误的,或者参考了 mod_php 的修改/损坏的源代码。

基本上,当请求进入时,apache httpd 会确定它引用的文件,并要求 mod_mime 根据文件设置请求的content_type(AddType) 和其他元数据(如handler(SetHandler、AddHandler)。此后,httpd 要求“每个”模块处理请求。为此,它会传递请求的handler-name(请参阅添加处理程序/设置处理程序)到模块,如果没有设置,则content_type(即media-type添加类型)到模块(因此从模块的请求处理程序的角度来看,媒体类型成为处理程序名称,正如您在ap_invoke_handler(请求接收*r)。 所以:

要点1) SetHandler 优先于 AddType,但只要未针对相关文件扩展名设置 SetHandler,使用 AddType 也不会有什么坏处。但除了设置文件的 MimeType 之外,还可以使用 AddType(除非 apache httpd 在没有设置的情况下回退到处理程序名称),例如,如果生成了目录视图(MultiView 默认在“说明”列中显示它)。

当模块的请求处理程序被调用时,它只是查看传递的字符串(即处理程序名称或内容类型)并决定是否处理它。根据php_handler(请求记录 *r))它接受application/x-httpd-php、 或application/x-httpd-php-sourcephp-script作为处理程序名称(请参阅定义)。对于其他所有情况,它都拒绝处理文件,这基本上是一个 noop。

带走2)除非你使用 mod_php 的修改版本,否则最好使用AddType application/x-httpd-php .php ...AddType application/x-httpd-php-source .phps ...除非需要覆盖 [继承] SetHandler/AddHandler 指令,或者不希望 mod_php 处理文件但需要正确的 MimeType 等。如果未设置处理程序名称,则 media-type 将用作处理程序名称

带走3)使用添加类型... 结果为更多一点的 CPU 周期,因为在将内容类型传递给模块的请求处理程序之前,会ap_invoke_handler()尝试删除任何“;.*”后缀以及尾随空格。但除非 CPU 非常慢,否则在生产环境中不应该注意到它(即使正确测量),因为上下文切换、网络等其他“噪音”会导致更多、更大的延迟。

为了完整起见,如果你想知道 mod_mime 如何处理 AddType 和 AddHandler:它使用相同的元数据结构两者都适用。每个元数据结构都由给定的扩展进行哈希处理(请参阅添加扩展信息 (...))。当被询问时,两者(即处理程序名称以及媒体类型)都会设置为请求(请参阅find_ct(请求记录 *r))。

相关内容