Apache 下载 php 文件而不是处理它们(在 php 7 升级后)

Posted

技术标签:

【中文标题】Apache 下载 php 文件而不是处理它们(在 php 7 升级后)【英文标题】:Apache downloads php files instead processing them (after php 7 upgrade) 【发布时间】:2016-12-30 11:51:03 【问题描述】:

我已经安装了 CentOS 7.2、Apache 2.4.6,并在上面运行了 php 5.4。 现在我想将我的 PHP 版本升级到 7,因此我按照本文中描述的步骤进行操作:

How To Upgrade to PHP 7 on CentOS 7

curl 'https://setup.ius.io/' -o setup-ius.sh
sudo bash setup-ius.sh
sudo yum remove php-cli mod_php php-common
sudo yum install mod_php70u php70u-cli php70u-mysqlnd
sudo apachectl restart

它安装了 php 7,我可以用它来执行 php 代码。 php -v 给我:

PHP 7.0.9 (cli) (built: Aug 16 2016 10:01:52) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

当我通过 apache 访问带有 <php phpinfo(); ?> 的 php 文件时,它会要求我下载该文件。

在我的/etc/httpd/conf.modules.d 我有以下内容:

<IfModule prefork.c>
  LoadModule php7_module modules/libphp7.so
</IfModule>
<IfModule !prefork.c>
  LoadModule php7_module modules/libphp7-zts.so
</IfModule>

我在 httpd.conf 中的虚拟主机都有(并且在旧的 php5.4 情况下有),它们是由我的 Virtualmin 设置自动创建的:

AddType application/x-httpd-php .php
AddHandler fcgid-script .php
AddHandler fcgid-script .php5
FCGIWrapper /home/myvhost/fcgi-bin/php5.fcgi .php
FCGIWrapper /home/myvhost/fcgi-bin/php5.fcgi .php5

/home/myvhost/fcgi-bin/php5.fcgi的内容如下:

#!/bin/bash
PHPRC=$PWD/../etc/php5
export PHPRC
umask 022
export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=99999
export PHP_FCGI_MAX_REQUESTS
SCRIPT_FILENAME=$PATH_TRANSLATED
export SCRIPT_FILENAME
exec /bin/php-cgi

我不确定 php 代码没有被 apache 正确处理的原因是什么。我希望你能给我一些关于如何解决/调查它的想法。如果需要,我很乐意提供有关设置的更多信息。

【问题讨论】:

【参考方案1】:

您需要指定 Handler 而不是媒体类型。例如:

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

旁注:如今,除非您为了线程安全而编译了 php,否则您应该考虑使用带有 mpm_event 和 mod_proxy_fcgi + php-fpm 的 Apache 2.4,而不是“带有 prefork + mod_php 的 Apache 2.4”。

【讨论】:

我在/etc/httpd/conf.modules.d/10-php.conf 的底部添加了您的行并重新启动了httpd。不幸的是,我没有看到任何行为差异。 请注意,“文件”对 Apache 来说没有任何意义,上下文可以。您确定正在加载该文件吗?以及在哪个上下文中添加的?例如,将其添加到适当的虚拟主机中。最后,您的要求是什么? /etc/httpd/conf/httpd.conf`IncludeOptional conf.d/*.conf。它会拾取这些 conf 文件,如果我删除一些文件,它会给我与已删除文件相关的适当错误。一个请求就像http://myvhost.com/i.php,它给出一个200的返回码和一个“application/x-httpd-php”的内容类型,浏览器要求下载这个文件,里面有所有的php内容。内容是有效的,并且在 php5.4 设置中运行时确实有效。 在我的虚拟主机中它具有以下内容。由于这仍然是指 php5,我想知道它是否可能是问题的一部分:AddType application/x-httpd-php .php AddHandler fcgid-script .php AddHandler fcgid-script .php5 FCGIWrapper /home/relovest/fcgi-bin/php5.fcgi .php FCGIWrapper /home/relovest/fcgi-bin/php5.fcgi .php5 所以在一个地方你正在加载 mod_php 模块,在另一个地方你有一个 mod_fcgid 或类似的包装器。相当混乱:),删除你的虚拟主机中的所有这些,并在适当的虚拟主机中添加我告诉你的内容,确保没有其他分配处理程序或类型,因为我指定的是除了加载模块之外你唯一需要的东西.【参考方案2】:

我希望您使用的是 webmin(virtualmin) 并且在安装 php 后实际上已经修改了一个文件,如果您检查/etc/httpd/conf.d/php.conf,您可能会在其中看到未注释的行。 同时您可能会看到 php.conf.rpmnew 是旧版本的行注释掉了,因此只需将 # 添加到该文件中的每一行或删除它并将旧文件 php.conf.rpmnew 重命名为 php.conf 之后不要忘记重新启动apache:

apachectl 重启

【讨论】:

以上是关于Apache 下载 php 文件而不是处理它们(在 php 7 升级后)的主要内容,如果未能解决你的问题,请参考以下文章

提供 PHP 文件作为下载,而不是执行它们

浏览器下载 PHP 文件而不是执行它们。 Webmin + Nginx

Apache 显示 PHP 代码而不是执行它

Apache 显示 PHP 代码而不是执行它

Apache 显示 PHP 代码而不是执行它

浏览器要求我下载 php 文件