6

好的,这听起来可能有点疯狂,但请耐心等待一分钟。

我正在一个网站上工作,该网站的标准是使用 SSI 来包含页眉、页脚和菜单。包含的文件使用 SSI 条件来处理不同的浏览器,一些 #include 嵌套,以及一些 #set / #if 技巧来突出显示菜单中的当前页面。换句话说,它不仅仅是 SSI 中的#include 指令。

我敢肯定有些人可能会与美学争论,但它实际上工作得很好,对于静态 HTML。

现在,问题来了:我只想从我的 PHP 脚本中“#include”相同的 SSI 解析的页眉和页脚 html 文件,从而避免代码重复并仍然保持网站的统一外观。如果 PHP 在通常的 mod_php 环境中运行,我可以通过使用 PHP 的 virtual() 函数来做到这一点。不幸的是,该站点使用 FastCGI/suexec 来运行 PHP(以便每个 VirtualHost 可以作为不同的用户运行),这会破坏 virtual()。

我一直在使用我用 PHP 编写的一个相当简单的 SSI 解析器(它处理 #includes 和一些非常简单的 #if 语句),但我想要一个更通用的解决方案。所以,在我发疯写一些可能有问题的、更完整的 SSI 解析器之前,有人知道用 PHP 编写的完整的 SSI 解析器吗?当然,我也愿意接受在我所概述的限制下工作的其他解决方案。

非常感谢您的宝贵时间。

4

2 回答 2

2

看看 ESI:http ://en.wikipedia.org/wiki/Edge_Side_Includes

您可以创建一个 PHP 代理来处理它们,它是 Symfony2 中的 HttpCache:https ://github.com/fabpot/symfony/blob/master/src/Symfony/Component/HttpKernel/HttpCache/Esi.php

或者使用像 Varnish 这样的 HTTP 代理,比 Symfony2 性能更高...

于 2011-02-10T12:03:35.560 回答
1

我意识到这是一个老问题,但几年前我遇到了同样的问题,尽管使用 perl 实现。我继续进行了先前的尝试,并在实现一个完整的 apache (2.2.22)mod_include模拟器/解析器作为 perl 模块http://search.cpan.org/dist/CGI-apacheSSI/lib/CGI/apacheSSI方面取得了很大进展.pm在那之后不久,我发现了 apache output filters,并意识到满足我需求的解决方案是多么完美。基本上,您可以告诉 apache 解析脚本的输出,就好像它是 .shtml 或 .php(或其他)文件一样。因此,您可以从 perl 或 php(或其他)脚本输出 SSI 标记,并让 apache 对其进行解析。这是你可以做到的(在你的 .htaccess 文件中):

AddOutputFilter INCLUDES .cgi

这是针对普通 cgi 文件的,但要注意,这会为所有正在执行的 .cgi 文件增加相当多的开销,所以我实际上要做的是创建一个特殊的扩展名,以便它作为 cgi 运行,然后解析其输出,而无需添加到普通 cgi 文件的开销:

<Files ~ ".pcgi$">
    Options +SymLinksIfOwnerMatch +Includes
    AddOutputFilter INCLUDES .pcgi
</Files>

对于 php,您可以执行以下操作:

<Files ~ ".pphp$">
    Options +SymLinksIfOwnerMatch +Includes
    AddOutputFilter INCLUDES .pphp
</Files>

这应该可以解决问题!希望能帮助那里的人。

于 2015-07-06T20:44:26.290 回答