Plesk 的 Apache 与服务器的 Apache 之间存在 PHP 版本冲突

Conflicting PHP versions between Plesk's Apache and the server's Apache

这是 的延续。这个问题的简短形式是我需要服务器的 Apache 实例指向 Plesk 的 Apache 版本。如果 Plesk 的 PHP7 版本随 libphp7.so 文件一起提供,这将是微不足道的。它不是。因此,有没有...

A) 允许我的服务器 Apache 指向 Plesk 的 PHP 安装的解决方法。或者...

B) 让 Plesk 的 Apache 安装成为我服务器上唯一的 Web 服务器的方法?

给你上一个问题的简短版本。我更喜欢使用 URI 路径(例如,example.com/action1/action2)来指导我的程序。这是通过使用 .htaccess 文件允许文件 action1 被解释为 PHP 文件来完成的。

RewriteEngine On
RewriteBase /
Action application/x-httpd-php modules/libphp7.so
AddHandler application/x-httpd-php .php
<Files action1>
  SetHandler application/x-httpd-php
</Files>

似乎正在发生的是使用 Plesk 版本的 PHP 执行任何正常的 PHP 文件(例如,index.php)。然而,当涉及到 .htaccess 时(执行 action1,尽管它象征性地链接到 index.php),突然使用的是服务器安装的 PHP。

我考虑过尝试使用 Plesk 的配置重新配置我的服务器的 Apache 服务器,但事实证明只是将配置拖出 Plesk 是一个令人生畏的过程。

感谢您的意见。

问题解决了,至少在我愿意解决的范围内。在虚拟主机 Apache 配置文件中,我们有...

<Files ~ (\.php$)>
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000
</Files>

这就是 Plesk 专门通过域名将 PHP 的一个版本附加到另一个版本的方式。任何不属于此规则的内容均由 Apache 的全局规则解释,对我而言,它正在查看 PHP 的不同安装。 (为什么 Plesk 没有全局覆盖来指向他们自己的 PHP 安装有点奇怪,但我怀疑这是他们以前从未遇到过的错误。)因此,从逻辑上讲,我们会只需要为我们要处理的每个文件添加没有 .php 后缀...

<Files action1>
    SetHandler proxy:unix:///var/www/vhosts/system/wwphelps.com/php-fpm.sock|fcgi://127.0.0.1:9000
</Files>

您确实需要这样做,但对我来说并没有像宣传的那样奏效。我的网页只是说 "Access Denied" 而我的错误文件将我指向 FPM 的 security.limit_extensions 参数。换句话说,尽管明确标识了一个我想使用的没有后缀的文件,但 FPM 还是拒绝了它。这就是我偷懒的地方。我将变量重置为空。在 Plesk 中,这是通过在域的 conf 目录中创建或修改 php.ini 文件并添加(包括 header,如果它不存在的话)...

来完成的
[php-fpm-pool-settings]
security.limit_extensions =

重新启动 Apache,Bob 就是你的叔叔了。

根据非常快速的 Google 搜索,从 Plesk 内部直接修改 FPM 参数的能力仍然存在争议。

现在,这是有代价的。从 FPM socket 的角度来看,突然间你的 web root "could" 中的任何文件都作为 PHP 文件执行,包括客户上传的图像和你盲目地放在你的 [ROOT]/images 目录中的图像。除非您以其他方式告诉 Apache,否则任何旧文件都不会被解释为 PHP 文件,这一事实让您部分得救。但是,如果您通过您的站点上传的所有文件都经过 (a) 彻底审查以确保它们与他们声称的一样,并且 (b) 保存在网络根目录之外或数据库中,那么您会得到更好的保护,这样就没有人可以 "execute" 直接引用它们。

最后,应该有一种方法可以在配置文件中覆盖那些我想故意违反的文件 security.limit_extensions。不幸的是,FPM 和 Apache 似乎并不互相交谈,否则块的使用将完全覆盖 security.limit_extensions。据我所知,有一种方法可以做到。我很想知道,但我有一个可行的解决方案,所以我回去工作了。