我在我的Apache conf中获得了以下内容来获得PHP-FPM的工作方式:
FastCgiExternalServer /srv/www/fast-cgi-fake-handler -host 127.0.0.1:9000 AddHandler php-fastcgi .php AddType text/html .php Action php-fastcgi /var/www/cgi-bin Alias /var/www/cgi-bin /srv/www/fast-cgi-fake-handler DirectoryIndex index.php
这工作正常,但SCRIPT_NAME始终是/var/www/cgi-bin和一些脚本使用SCRIPT_NAME来计算当前脚本(vBulletin)的位置。
Google为Nginx提供了大量的解决scheme,但对于Apache来说并不是一句话。
如果你使用RewriteRule来代替“Action”方法,那么它会工作得很好
下面给出的是我在Apache中用来连接到FCGI :: Daemon外部fastcgi守护进程的一个例子。 这个守护进程可以被认为是perl的php-fpm版本。
<VirtualHost 127.0.0.1:80> ServerAdmin [email protected] DocumentRoot "/var/www/example" ServerName www.example.com <IfModule mod_fastcgi.c> FastCGIExternalServer /var/www/fcgi-daemon/perl.fcgi -socket /var/run/fcgi-daemon.sock ScriptAlias /perl.fcgi /var/www/fcgi-daemon/perl.fcgi </IfModule> </VirtualHost> <Directory /var/www/example/cgi-bin> Options ExecCGI RewriteRule ^(.*)$ /perl.fcgi [L] </Directory>
注意:“/ var / www / fcgi-daemon /”必须存在! 作为空白目录。 实际上,您用于php的方法不适用于perl守护进程。 SCRIPT_FILENAME总是/var/www/fcgi-daemon/perl.fcgi,从来不存在,导致错误。 使用RewriteRule保留所有必需的环境variables,并将它们传递给perl fastcgi守护进程。
我发现将FastCgiExternalServer设置为一个存在的目录(可能也适用于某个文件),比如/srv/www那么所有的PHPvariables设置都是正确的。 但是,所有非PHP内容都可以作为text/html或text/plain ,不是很好。 此外DirectoryIndex停止有一个效果,这让我想起了StackOverflow的这个问题,但我无法用他的绝对和相对path的杂耍解决scheme得到任何地方。
对于PHP-FPM,Apache和SCRIPT_NAME来说,唯一相关的Google结果是由一个叫Dimas的人发表的评论,他说这种方法为他修复了这个问题 ,但是我没有这样的运气。
我已经采取了将我的php.ini中的auto_prepend_file设置为包含以下内容的文件:
<?php $_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED']; unset($_SERVER['PATH_TRANSLATED']); $_SERVER['SCRIPT_NAME'] = $_SERVER['PATH_INFO']; unset($_SERVER['PATH_INFO']);
不是最好的解决scheme,但至less我不必手动编辑vBulletin,Wordpress等
您可以通过确保php.ini中的cgi.fix-pathinfo设置为1来解决这个问题。这会导致PHP像在Apache上以CGI / FastCGI方式执行PHP时那样填充$ _SERVER数组。
https://serverfault.com/a/423965/118969由ColtonCat上面,是最好的答案。 我试过用nginx(ssl-reverse-proxy) – > apache – > php53-fpm。
如果使用nginx(ssl-reverse-proxy) – > apache + mod_php ,则可以使用cgi.fix_pathinfo = 0