我正在开发一个网站,其标准是使用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解析器?当然,我也对在我所概述的限制条件下工作的其他解决方案持开放态度。
非常感谢你的时间。
答案 0 :(得分: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更具性能......
答案 1 :(得分: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>
那应该可以做到!希望能帮到那里的人。