我有以下设置:
- 普通服务器:以纯文本形式提供 php 文件
- 代理服务器:向 Plain-Server 询问 php 文件并进行解析。
现在我的问题是:如何配置代理服务器(带有 PHP 5.3 的完全可配置的 apache 2.2)来解释来自 Plain-Server 的纯 php 文件?
示例:给定 Plain-Server 上的一个小 php 脚本“hello.php”(可通过http://plainserver/hello.php):
<?php
echo "Hello World";
?>
Plain-Server 仅将其作为纯文本输出,不解析 php 代码。
在代理服务器上,文件“hello.php”不存在。但是当从代理服务器请求hello.php时,它应该使用mod_proxy(反向代理)从普通服务器获取hello.php。它还应该解析并执行php,只说“Hello World”。
反向代理已在运行,但 php 代码无法执行。我尝试了 mod_filter,但无法使其工作。有什么想法可以解决吗?(注:也发布在 stackoverflow.com 上)
答案1
你不需要。好吧,至少 mod_proxy 不需要。你可以使用代理 PHP 脚本来请求内容并对其进行评估,但是... 呃。
无论你在做什么,公平地说,你做错了。
答案2
我找到了另一种使用 mod_ext_filter 的方法。将以下内容添加到您的 httpd.conf:
ProxyPass /test/ http://localhost:9000/
<IfModule mod_ext_filter.c>
ExtFilterDefine parse-php mode=output intype=text/html cmd="/usr/bin/php"
</IfModule>
ProxyPassReverse /test/ http://localhost:9000/
<LocationMatch "\.php">
SetOutputFilter parse-php
</LocationMatch>
因此,它运行位于 /usr/bin/ 中的外部应用程序 php。它的缺点是:启动一个单独的进程,并解析不属于文件夹 /test/ 的 php 文件。
我也尝试使用 fast-cgi 或 mod_php 来解析 php 文件,但无法正常工作。有没有人知道如何使用 fast-cgi 来解释 php 文件?
答案3
这确实是一个糟糕的解决方案...但是在代理机器上不要配置任何代理,而是添加
ErrorDocument 404 /index.php
并在index.php中放入检查$_SERVER['REQUEST_URI']的逻辑,从内容服务器下载代码并使用eval执行。
但这很糟糕,包含将不起作用...womble 是对的。只需尝试另一种方法。如果你真的很绝望,也许可以使用 webdav 和达夫斯,但这仍然是丑陋的黑客,如果你坚持在一台机器上托管代码并在另一台机器上解释代码,那么 nfs 会更加高效。
答案4
我遇到了类似的问题——在我的例子中,主“纯文本”服务器可以将 XQuery 解析为 HTML,但不能将 PHP 解析为 HTML。因此,我决定使用 Apache 填补这一空白,但同时也希望整个网站是独立的,以便于备份。
我通过将 Apache 设置DocumentRoot
为与主服务器提供文件的目录相同的目录来解决这个问题,然后用于ProxyPassMatch
匹配以 结尾的请求.php
,并告诉 mod_proxy不是!
通过在指令语句末尾添加以下内容来代理这些文件:
DocumentRoot "/path/to/localhost.main/
…
ProxyRequests off
ProxyPassMatch ^/(.*\.php)$ !
ProxyPass / http://localhost.main:8080/
ProxyPassReverse / http://localhost.main:8080/
ProxyPassReverseCookieDomain localhost.proxy localhost.main
这样,所有 PHP 文件都会被解析(在我的情况下是通过 FastCGI,但也应该与 mod_php 一起使用)并由 Apache 提供服务,其余文件则落到主服务器。
不过,我也在此基础上进行了重写,将酷炫的 URI 映射到带有查询参数的处理脚本,这需要另一条规则才能正常工作,尽管这里的逻辑是颠倒的,因为它在正则表达式内部执行否定(使用否定后视):
RewriteRule ^/(.*(?<!\.php))$ /path/to/script/$1 [L,PT,QSA]