Назад | Перейти на главную страницу

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, было бы проще. Но в целях обучения я действительно хочу пройти трудный путь.

Вот мое собственное решение (используйте RewriteRule с флагом [P] вместо 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>