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

Jua*_*nio 6 php apache

这是我的 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>
Run Code Online (Sandbox Code Playgroud)

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

例如,如果/var/www/awesome/index.php存在,我去http://foo.com/index.php我得到正确的响应,但如果/var/www/awesome/foo.php不存在,我去http://foo.com/foo.php,我只是得到回应File not found.

.htaccess文件未被读取,因为 Apache 将所有内容都交给 PHP-FPM。

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

但是,由于 Apache 将所有内容都交给 php-fpm,因此它似乎无法正确处理这些错误。

小智 5

对于今天阅读的人来说,这是正确的答案,感谢 Tito1337 的回答

ProxyErrorOverride如果您在代码中设置 404 或处理某些错误,可能会给您带来问题或破坏您的应用程序,并且实现起来更加复杂。

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>
Run Code Online (Sandbox Code Playgroud)