Apache 2.4 + PHP-FPM,捕获错误页面

时间:2014-09-12 06:00:02

标签: apache php

这是我的vhost文件:

 <VirtualHost *:80>
   ServerName awesome.dev

   ## Vhost docroot
   DocumentRoot "/var/www/awesome"

   ## Directories, there should at least be a declaration for /var/www/awesome
   <Directory "/var/www/awesome">
     Options Indexes FollowSymLinks MultiViews
     DirectoryIndex index.php
     AllowOverride All
     Require all granted
   </Directory>

   ## Logging
   ErrorLog "/var/log/apache2/w0JhArMoDehc_error.log"
   ServerSignature Off
   CustomLog "/var/log/apache2/w0JhArMoDehc_access.log" combined

   ## Server aliases
   ServerAlias www.awesome.dev

   ## SetEnv/SetEnvIf for environment variables
   SetEnv APP_ENV dev

   ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/awesome/$1
 </VirtualHost>

我试图捕获对不存在的* .php文件的所有请求。

例如,如果/var/www/awesome/index.php存在且我转到http://foo.com/index.php,我会得到正确的回复,但如果/var/www/awesome/foo.php不存在且我转到http://foo.com/foo.php,我就是只需得到File not found.的回复。

由于Apache将所有内容移交给PHP-FPM,因此无法读取.htaccess文件。

我需要捕获所有404请求并显示常见错误页面,就像您在任何网站上看到的一样。

然而,由于Apache把所有东西都交给php-fpm,它似乎没有正确处理这些错误。

3 个答案:

答案 0 :(得分:2)

我曾经有同样的问题,最后我修好了。

尝试在ProxyPassMatch设置后添加:

ProxyErrorOverride on
顺便说一下,别忘了你的

ErrorDocument 404 /path/to/file

设置。

答案 1 :(得分:0)

由于在apache / php-fpm过程中可能会出现很多问题,许多错误都会导致响应“文件未找到”,并且在日志中“AH01071:收到错误'主要脚本未知\ n'”:(路径中的双斜线) ,权限,......)

要跟踪它们,您可以:

  • 输入您的apache配置“LogLevel debug”并检查错误日志。
  • 和/或将你的配置临时恢复为“简单的apache只尝试”,在我的情况下它导致我的权限问题(www 0751需要是0755)错误,之前是隐形的。

Ps:注意另一个线程,人们说使用ProxyErrorOverride是“真是个坏主意”:https://serverfault.com/questions/450628/apache-2-4-php-fpm-proxypassmatch

答案 2 :(得分:0)

对于今天阅读的任何人,这里是正确答案,感谢 Tito1337 的answer

如果您在代码的其他地方设置 404 或处理一些错误,

ProxyErrorOverride 可能会给您带来问题或破坏您的应用程序,而且实现起来更复杂。

相反,您应该仅在文件存在时将请求传递给 php-fpm。如果该文件不存在,Apache 将定向到您定义的 ErrorDocument。您可以在 Apache 配置中围绕 PHP 处理程序添加此检查。

CentOS 8 示例:

#
# Redirect to local php-fpm (no mod_php in default configuration)
#
<IfModule !mod_php5.c>
  <IfModule !mod_php7.c>
    # Enable http authorization headers
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1

    <FilesMatch \.(php|phar)$>
        
        # NEW ADDITION - CHECK IF FILE EXISTS FIRST
        <If "-f %{REQUEST_FILENAME}">
            
            SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost"
            
        </If>
        
    </FilesMatch>
  </IfModule>
</IfModule>