Apache 2.4 + PHP-FPM + 动态 ProxyPassMatch

Apache 2.4 + PHP-FPM + 动态 ProxyPassMatch

预期结果:

如果我转到http://foo.local/index.php,文件/var/www/html/foo/index.php将被执行。

如果我去的话也会类似http://bar.local/index.php/var/www/html/bar/index.php会被执行。

这是我的配置:

<VirtualHost *:80>
    ServerAlias *.localhost
    VirtualDocumentRoot /var/www/html/%1/

    <IfModule proxy_module>
        #ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://localhost:9000/var/www/html/$1 (this  line works in normal virtualhost)
        ProxyRemoteMatch ^([^.]+).*/(.*\.php(/.*)?)$ fcgi://localhost:9000/var/www/html/$1/$2
    </IfModule>
</VirtualHost>

目前,这对于 .html 等静态文件来说运行良好。但它会打印 .php 文件而不是执行它们。

请指教,谢谢。

PS:如果我使用 mod_php 而不是 php-fpm,那会更容易。但出于学习目的,我真的想走一条困难的路。

答案1

这是我自己的解决方案(使用带有 [P] 标志的 RewriteRule 而不是 ProxyPass):

<VirtualHost *:80>
    ServerAlias *.localhost
    VirtualDocumentRoot /var/www/html/%1/

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^([^.]+) [NC]
    RewriteRule ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/%1/$1 [P]
    #<IfModule proxy_module>
        #ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1
        #ProxyRemoteMatch ^([^.]+).*/(.*\.php(/.*)?)$ fcgi://php:9000/var/www/html/$1/$2
    #</IfModule>
</VirtualHost>

相关内容