Apache:反向代理从另一台服务器处理PHP

我有以下设置:

  • Plain-Server :以纯文本格式传送php文件
  • Proxy-Server :询问Plain-Server的php文件并parsing它。

现在我的问题:我如何configuration代理服务器(一个完全可configuration的Apache 2.2与PHP 5.3)来解释从普通服务器的纯PHP文件?

例如:在Plain-Server上指定一个小的php脚本“hello.php”(可通过http://plainserver/hello.php访问):

<?php echo "Hello World"; ?> 

Plain-Server只输出纯文本,不parsingphp代码。

在代理服务器上,文件“hello.php”不存在。 但是当从代理服务器请求hello.php时,它应该使用mod_proxy(反向代理)从Plain-Server获得hello.php。 它也应该parsing和执行PHP,只说“Hello World”。

反向代理已经在运行,但执行php代码不起作用。 我试过mod_filter,但不能使它工作。 任何想法如何? (注:也张贴在stackoverflow.com)

你没有。 那么,不pipe用mod_proxy。 你可以有一个代理PHP脚本,请求的内容和evals它,但…呃。

无论你在做什么,公平地说你做错了。

我用mod_ext_filterfind了另一种方法。 将以下内容添加到您的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 /中find的外部应用程序php。 坏事情:启动一个单独的进程,并parsingphp文件,这不是文件夹/ test /的一部分。

我也尝试使用fast-cgi或mod_php来parsingphp文件,但无法使其工作。 任何想法如何使用fast-cgi解释php文件?

这是非常糟糕的解决scheme…但在代理机器上不要configuration任何代理,而是添加

 ErrorDocument 404 /index.php 

并在index.php中放置检查$ _SERVER ['REQUEST_URI']的逻辑,从内容服务器下载代码并使用eval执行它。

但这很糟糕,包括不会工作… womble是正确的。 只是尝试另一种方法。 如果你真的绝望,也许使用webdav和davfs ,但这仍然是丑陋的黑客攻击,如果你坚持在一台机器上托pipe代码并在另一台机器上解释,nfs会更有效率。

我有一个类似的问题 – 在我的情况下,主“纯文本”服务器可以parsingXQuery到HTML,但不是PHP。 所以我决定填补与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文件都得到parsing(在我的情况下通过FastCGI,但也应该与mod_php一起工作),并由Apache服务,其余的通过到主服务器。

我也在做这个重写,尽pipe如此,要将酷的URI映射到一个带有查询参数的处理脚本,这需要另一个规则才能正常工作,尽pipe这里的逻辑是反转的,因为它在正则expression式本身内部是否定的(使用否定向后看):

 RewriteRule ^/(.*(?<!\.php))$ /path/to/script/$1 [L,PT,QSA]