【问题标题】:Using Apache Server-side Flow Control in PHP?在 PHP 中使用 Apache 服务器端流控制?
【发布时间】:2010-08-30 00:19:02
【问题描述】:

正如this question 中所讨论的,我正在使用 Apache mod_include 和条件流控制语句来根据父页面的 URL 更改包含的 shtml 文件的行为。我遇到的问题是网站上的某些页面是 PHP 页面,这似乎意味着 mod_include 指令被忽略(而是被视为标准 html cmets)。

有什么方法可以让 PHP 页面正确处理这些 mod_include 指令?

具体来说,这是我要处理的内容:

<!--#if expr='"$DOCUMENT_NAME" = /(podcasts\.php)|(series\.php)/' -->
<li id="features" class="current">
<!--#else -->
<li id="features">
<!--#endif -->

类似的行块在站点上的 .shtml 文件中起作用,但对于 php 页面,上述所有内容最终都会输出到客户端。

编辑:我想出的最接近解决方案的方法是模仿 php 文件中包含的 shtml 文件的功能。我不喜欢这个解决方案,因为这意味着将来添加链接需要将它们添加到多个位置。

【问题讨论】:

  • 您是否遇到&lt;!--#include virtual="foo.php" --&gt; 未执行或mod_include 未处理.php 文件的问题?
  • 前者。在这种情况下不是专门针对&lt;!--#include --&gt;,而是&lt;!--#if expr='"$DOCUMENT_NAME" = /(mypage\.php)/--&gt;
  • 已编辑问题以提供更多详细信息。
  • 如果您担心将来不得不在多个地方添加链接,如果您选择了您心目中最接近的解决方案,为什么不使用一些存储/检索机制,让它成为一个 db,一个包含文件、数组和函数的文件夹,该函数将在需要时获取并回显标记块,这样您只需更改一次引用的标记并包含它,还是我没有得到正确的问题?
  • 问题在于该站点的大部分内容是静态 .shtml 文件。 Apache 可以处理 SSI 以将一个 shtml 文件加载到另一个文件中。据我所知,没有办法(除了一些丑陋的 AJAX hack)将动态的、数据库驱动的函数加载到静态 shtml 文件中。我错了吗?

标签: php apache mod-include


【解决方案1】:

假设您通过 mod_php 运行 PHP(甚至可能无关紧要),只需添加:

AddOutputFilter INCLUDES .shtml .php

它适用于 .shtml 和 .php 并且都被正确解析。

【讨论】:

  • 是的!将此添加到我的 .htaccess 文件中会导致所有页面都按预期运行。太棒了!
【解决方案2】:

我刚刚开始阅读有关 SSI 的信息,但在以下位置找到了这句话 http://httpd.apache.org/docs/2.2/howto/ssi.html#configuring

关于不该做什么的简短评论。偶尔会看到人 建议您只告诉 Apache 解析所有 .html 文件 SSI,这样您就不必弄乱 .shtml 文件名。这些 人们可能还没有听说过 XBitHack。要记住的事情 是不是,通过这样做,您需要 Apache 通读 它发送给客户的每一个文件,即使他们没有 包含任何 SSI 指令。这会使事情变慢很多,并且 不是个好主意。

所以如果我理解正确,你不应该在 AddOutputFilter 中包含 .php,因为如果强制 Apache 搜索所有 .php 页面以查找 SSI 指令,因为它会减慢服务器速度。

也许您的问题还有其他解决方案?

http://httpd.apache.org/docs/2.2/mod/mod_include.html#xbithack

/菲利普

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多