它是 Mod。它是 Layout。有问题吗?
像大多数开源探险一样,mod_layout 的诞生源于一个需求。大约在 1997 年,我正在开发一个名为 Virtual Hospital 的网站 (http://www.vh.org/)。当时,我们正在使用 Netscape 的 Fast Track 服务器。我真的很想切换到 Apache,但必须克服两个障碍。首先,我们必须让管理层接受,找到懂得如何配置 Apache 的人很容易(Netscape 的图形界面似乎让人相信它很容易配置和维护),其次,Netscape 可以添加页脚。Netscape 服务器通过允许您在它正在处理的任何文档的末尾任意添加 HTML 来支持页脚。这远非完美,但它满足了大多数网站的基本需求。
第一个障碍很容易清除,因为我们必须持续编辑 Netscape 服务器的配置文件,而且由于关于其文件格式的文档太少,我们发现维护很快就变成了一件苦差事。
第二个问题通过创建一个自定义处理程序来解决。解决方案是一个用 C 语言编写的小应用程序,它为每个 HTML 文档调用。虽然这行得通,但它存在许多问题。例如,我们现在有一个应用程序每秒运行几次。这也没有解决我们的 CGI 脚本的问题,这些脚本仍然必须修改,使其输出与 HTML 处理程序的输出相匹配。这远非理想的解决方案。
当我在不同的网站上工作时,我不断遇到类似的问题。有人会过来,希望将版权、页眉或类似的东西应用于他们网站上的所有文档,而且,通常情况下,他们会向我展示另一种新的网站技术来创建内容。他们还希望在不更改网站内容的情况下做到这一点,而且必须易于更新和修改。
为了响应这些需求,我创建了 ModLayout。ModLayout 通过查看处理程序和 MIME 类型来确定是否处理文档。例如,如果您希望处理 PHP4 脚本,您可以使用指令 LayoutHandler 和参数 application/x-http-php。ModLayout 处理大多数常见的 MIME 类型,而无需在 Apache 的配置文件中指定处理程序;这些可以通过 “LayoutDefaultHandlers Off” 禁用,然后您可以添加回您想要包装的内容。通常,网站会有一些特定的文档,他们不希望被包装。为此,您可以使用指令 “LayoutIgnoreURI”,并且还有忽略指令,仅用于删除页眉、页脚或 HTTP 标头。
ModLayout 为 Apache 进程提供了三个额外的阶段。它提供了页眉阶段、页脚阶段和一个用于处理 HTTP 标头的阶段。如果您需要为所有文档动态创建 HTTP 标头,ModLayout 将允许您这样做。页眉和页脚出现在 HTML 页面中,位于原始文档之前和之后。
页眉和页脚有三种类型。您可以添加一段简单的文本
LayoutHeader "Sample header" LayoutFooter "Sample Footer"
或者您可以使用以下方式插入整个文件
LayoutHeader /usr/local/apache/htdocs/header.html LayoutFooter /usr/local/apache/htdocs/footer.html或通过 URI
LayoutHeader /header.pl LayoutFooter /footer.php当您对页眉和页脚有简单的要求时,以上示例将起作用。前两个示例也效果很好,因为它们的内容缓存在 Apache 进程中。但是,如果您需要动态的东西,您可以使用 URI 示例。ModLayout 不关心使用的 URI 类型,它可以是任何东西,从简单的 CGI 和 SSI 到用 Perl、PHP 或 Java 编写的复杂应用程序。也可以使用用 C 语言使用 Apache API 编写的自定义模块。如果您只想使用 HTML 但不希望它被缓存,您可以简单地指定它的 URI 而不是它的完整路径。ModLayout 还为作为页眉和页脚调用的 URI 提供了额外的环境变量。这些变量提供有关原始文档状态的信息。ModLayout 的一大优势在于它可以与任何形式的内容一起使用,并且是语言中立的。
ModLayout 的一个常见用途是将版权声明附加到网站上的所有文档。为此,您可以使用以下方法
<VirtualHost www.example.com> <...insert normal content..> LayoutFooter "<P>Copyright Example.com 1995-200" LayoutHandler "application/x-httpd-php" </VirtualHost>
以上代码将在 www.example.com 虚拟主机的每个文档的底部插入文本,用于所有默认处理程序,包括 HTML 页面和 CGI 脚本,以及任何存在的 PHP4 脚本。
如果您想在原始文档上次修改的日期上添加标记,您可以将以下内容插入 PHP 文档中,并将其另存为 last-modified.php。
<?php echo("Copyright 2000 FooBar INC. <BR> Last Modified"); echo ($LAYOUT_LAST_MODIFIED); ?>
并将 LayoutFooter 指令更改为 /last_modified.php。
现在,让我们看一个更复杂的问题。假设您想为给定的站点创建一个自定义的外观和感觉,并由 Web 服务器强制执行,以下示例将有所帮助
<VirtualHost www.example.com> <...insert normal content..> LayoutHeader "/header.php" LayoutFooter "/footer.pl" LayoutIgnoreHeaderURI "/index.html" LayoutHandler "application/x-httpd-php" </VirtualHost>
在上面的示例中,该站点将有一个由 PHP 脚本创建的自定义页眉和一个作为页脚运行的 Perl 脚本。所有默认处理程序以及站点上的任何 PHP 脚本都被包装。请注意,index.html 文档不会被包装,因为大多数站点都有一个自定义的首页,但希望内部页面具有默认外观。您还可以使用 mod_random 及其随机引言功能来创建您自己的横幅广告系统。
当使用 mod_random 时,创建页眉时要记住的一件事是,您需要小心不要创建无效的 HTML(值得庆幸的是,大多数浏览器都会处理)。但是,如果您正在对外部用户创建的页面强制执行外观和感觉,他们很容易最终得到混乱的输出。
请记住,在带有框架的页面之前插入任何 HTML 都会破坏框架。目前,大多数人采用的解决方案是使用页脚和/或创建浮动 Javascript 框)。在未来的版本中,您将能够通过从页眉或页脚调用的 URI 收到的指令来关闭页眉、页脚和包装内容。
对于需求更复杂的网站,请参见列表 1。
列表 1 中提供的示例目前用于 http://www.tangent.org/。这允许网站文档包装,它会影响主文档根目录内容,但会保留用户的个人主页。虽然整个站点使用相同的页脚,但不同部分的页眉已更改。ModRandom 用于将随机引言插入页脚(值得庆幸的是,这些引言仅来自 辛普森一家,而不是广告横幅之类的烦人内容)。
使用 Directory、Virtualhost 和 Location 标签控制 ModLayout,您可以制定一些相当复杂的逻辑。您还可以通过 LayoutHTTPOverride 控制创建 HTTP 标头的内容,并通过 LayoutHTTPHeader 创建您自己的动态 HTTP 标头。目前,总共有大约 24 个指令,ModLayout 正在相当积极地开发中(开发者版本大约每月发布一次,完整版本大约每两个月发布一次)。鼓励提出功能建议,并且有一个邮件列表用于讨论功能、HOWTO 和错误。有关更多信息,请查看 Modlayout 主页 http://tangent.org/mod_layout/。
虽然 ModLayout 最初是为了解决我一直遇到的问题而创建的,但今天它在很大程度上是人们来信并要求新功能的结果。它的未来方向将在很大程度上取决于人们的要求和需求。
Brian Aker “因在 BBS 上工作而获得报酬。想象一下。” 这个 BBS 就是著名的 http://www.slashdot.org/,他在那里是 “数据库打手和 Apache 伙计”。他也是 mod_random 和其他 Apache 模块的作者。