![Apache 执行 HTML,但不执行 PHP;PHP CLI 可以工作](https://linux22.com/image/574862/Apache%20%E6%89%A7%E8%A1%8C%20HTML%EF%BC%8C%E4%BD%86%E4%B8%8D%E6%89%A7%E8%A1%8C%20PHP%EF%BC%9BPHP%20CLI%20%E5%8F%AF%E4%BB%A5%E5%B7%A5%E4%BD%9C.png)
我在 rhel 6.2 上安装 Apache 2.2.15 并运行 php 5.3.3,但无法让 Apache 解释 PHP 代码。
没有错误(在系统日志、httpd/error_log 或 php_errors.log 中)- 我已在 php.ini 中启用错误报告:
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = On
log_errors = On
error_log = /var/log/php_errors.log
然而,当我直接从浏览器(例如 myserver.com/index.php)查看包含以下代码的 index.php 时,除了白屏外什么都没有出现:
<?php echo 'Hello php World'; ?>
当在命令行上通过 php 执行时,我得到了预期的文本输出到终端(“ Hello php World
”)。
当我向 index.php 添加一些 HTML 时,如下所示:
<html>
<p>Hello from within html</p>
<?php echo 'Hello php World'; ?>
</html>
并使用我的浏览器查看它,它只返回“ Hello from within html
。”但是,从命令行执行时,我得到:
<html>
<p>Hello from within html</p>
Hello php World</html>
因此,PHP 是通过 CLI 进行解析和解释的,而不是通过 Apache 进行解析和解释的。
我已经确认 index.php 及其父文件结构归 apache:apache 所有,并且 apache 模块的 selinux 上下文:
chcon -t httpd_sys_script_exec_t /usr/lib/httpd/modules/*
chcon -t httpd_sys_script_exec_t /usr/lib/php/modules/*
以及要解析的 .php 文件:
chcon -R -h -t httpd_sys_content_t /export1
是正确的。我不认为 selinux 是问题所在,因为我没有收到任何权限错误,而且我暂时禁用了 selinux,echo 0 >/selinux/enforce
但 apache 无法成功解释 php。
php 模块正在加载其配置,并且 .php 扩展名被理解为在 httpd.conf 中配置:
LoadModule php5_module /usr/lib/httpd/modules/libphp5.so
AddType application/x-httpd-php .php .phtml
PHPIniDir /etc/
并且,apache 知道从以下位置寻找 index.php:
DirectoryIndex index.html index.html.var index.php
按照 httpd.conf 中的设置。
我已经想尽了所有办法,想不出问题出在哪里——甚至尝试重新安装 PHP——当然,如果大家能提供一些建议,我会非常感激。如果有用的话,以下是我启动 apache 时 /var/log/httpd/error_log 的内容:
[Fri Feb 03 13:44:53 2012] [notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[Fri Feb 03 13:44:53 2012] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Fri Feb 03 13:44:53 2012] [warn] module php5_module is already loaded, skipping
[Fri Feb 03 13:44:53 2012] [notice] Digest: generating secret for digest authentication ...
[Fri Feb 03 13:44:53 2012] [notice] Digest: done
[Fri Feb 03 13:44:54 2012] [warn] mod_wsgi: Compiled for Python/2.6.2.
[Fri Feb 03 13:44:54 2012] [warn] mod_wsgi: Runtime using Python/2.6.6.
[Fri Feb 03 13:44:54 2012] [notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.3 mod_ssl/2.2.15 OpenSSL/1.0.0-fips mod_wsgi/3.2 Python/2.6.6 mod_perl/2.0.4 Perl/v5.10.1 configured -- resuming normal operations
请帮忙!
答案1
看起来它php5_module
已经被您自己加载,稍后由默认配置加载,或者正在加载模块的rhel6
配置......这本身并不重要,除非您输入的配置被默认配置覆盖。rhel6
php5_module
rhel6
查看第 11 步丹的网站,以前每当我忘记并需要快速提醒时,这个方法都很有用:
# Make sure there's only **1** line for each of these 2 directives:
# Use for PHP 4.x:
#LoadModule php4_module modules/libphp4.so
#AddHandler php-script .php
# Use for PHP 5.x:
LoadModule php5_module modules/libphp5.so
AddHandler php5-script .php
# Add index.php to your DirectoryIndex line:
DirectoryIndex index.html index.php
AddType text/html .php
# PHP Syntax Coloring
# (optional but useful for reading PHP source for debugging):
AddType application/x-httpd-php-source phps
答案2
在我看来,你从来没有说过你是如何尝试访问示例文件的。你是index.php
直接访问(IE。http://example.com/folder/index.php)?
如果没有,请注意,如果存在,index.html
它将根据目录索引顺序被调用:
DirectoryIndex index.html index.html.var index.php
最后,这个问题应该在 serverfault.com 上询问,而不是在这里询问。
答案3
我遇到了类似的问题,最后通过设置解决了它short_open_tag = On
。/etc/php.ini
升级时请注意默认配置文件!
答案4
对我来说,问题在于模式未在 apache2 中启用。
干净的 Debian 安装、apache2 和 php7
我首先要禁用默认启用的 mpm_event mod,我不知道为什么。顺便说一句,mpm 是一种非常干净的 PHP 使用方式,您应该考虑使用它而不是 apache2 mod ;) 但是,为了快速工作:
# a2dismod mpm_event
# a2enmod php7.0
# systemctl restart apache2
成功了:)
享受