通过 ProxyPassMatch 作为处理程序转发 PHP 请求,或仅在文件存在时转发

ide*_*ide 10 httpd php-fpm proxypass fcgi apache-2.2

我正在迁移我的服务器以使用 mod_proxy_fcgi 和 php-fpm 而不是 mod_php。Apache 能够将 .php 请求转发到 fcgi 代理,并且 PHP 可以正确执行。我有这个工作:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使文件不存在,Apache 也会将所有 .php 请求转发给代理。这会导致一些问题。我的 ErrorDocument 规则没有被调用,DirectoryIndex index.php index.html也没有回退到 index.html。

我能够使用 mod_rewrite 解决这些问题:

RewriteEngine On                                                           
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$                       
RewriteCond /var/www/html/%2 -f                                   
RewriteRule . fcgi://127.0.0.1:9000/var/www/html/%1 [P] 
Run Code Online (Sandbox Code Playgroud)

但是,Apache 文档不推荐 RewriteRule:“这是因为此标志触发了默认工作程序的使用,该工作程序不处理连接池。”

理想情况下,我想我要么想在 FilesMatch 块中使用 ProxyPass(目前不受支持),要么定义一个新的处理程序,通过 fcgi 代理并使用它来处理 .php 请求,类似于 mod_php 所做的。

任何模拟标准 mod_php 设置但实际上通过 fcgi 代理的建议?

dmu*_*uir 7

一种选择是安装 mod_proxy_handler:https : //gist.github.com/progandy/6ed4eeea60f6277c3e39

或者您可以等待 Apache 2.4.10,它应该包含该模块。

基本上该模块可以让你做到这一点:

#tcp
<FilesMatch \.php$>
SetHandler proxy:fcgi://localhost:9000
</FilesMatch>

#uds
<FilesMatch \.php$>
    SetHandler "proxy:unix:/path/to/socket.sock|fcgi://./"
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)


小智 0

同上OP。

  • 我也无法弄清楚如何让 Apache VHOST 配置将无法找到的请求路由到 404。
  • 同样,我也因试图弄清楚如何获取无扩展名的 URL 来映射而陷入困境ProxyPassMatch
    • 当然...我可以通过代理路由所有内容php-fpm,但这会杀死 javascript 和 css 文件。

理论解

我的猜测是我必须编写一个自定义的404.php处理器 - 然后通过该处理器路由所有请求,并将请求的文件作为查询字符串附加。

例如:

RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-s
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_URI} !-l
RewriteRule ^.*$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/404.php?no_comprende=%{REQUEST_URI} [P]
...
ProxyPassMatch ^/(.*\.php(/.*)?)$    fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/$1
...
Run Code Online (Sandbox Code Playgroud)

理论上——并假设它们列出的顺序仍然正常适用:

在到达指令之前任何 404 的文件都会被捕获ProxyPassMatch

我的解决方案

  • php5-fpm (5.4.23)
  • 阿帕奇2.4.2
  • Ubuntu 12.04 / 3.8.0-34 x86_64

为了处理无扩展名的 URL,php-fpm我调整了上面的内容以在我的 VHOST 配置中查找无扩展名的 URL:

...
# Extensionless URL's
RewriteCond %{REQUEST_FILENAME} ^/((.*)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2.php -f
RewriteRule !.*\.php$   fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1.php   [P]

# files w/ .php extensions
RewriteCond %{REQUEST_FILENAME} ^/((.*\.php)(/.*)?)$
RewriteCond %{DOCUMENT_ROOT}/%2 -f
RewriteRule . fcgi://127.0.0.1:9000%{DOCUMENT_ROOT}/%1 [P]
...
Run Code Online (Sandbox Code Playgroud)

不太漂亮,但它确实完成了工作:-(