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

7

Here is my vhost file:

 <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,我只会得到一个文件未找到的响应。

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

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

然而,由于Apache将所有内容都交给了PHP-FPM,似乎无法正确处理这些错误。

3个回答

5

针对今天的读者,这里是正确答案,感谢Tito1337提供了他的答案

如果你设置了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>

1
不确定为什么这个问题没有得到更多的赞同...看起来这是允许apache的ErrorDocument处理404错误的正确方法,同时也允许在php中使用http_response_code(),而ProxyErrorOverride On会干扰这一点(因为apache会看到php抛出4xx/5xx代码然后进行干预)。 - dlo
为了避免503错误,我不得不添加以下内容:<Else> SetHandler default-handler </Else> - fred727

3
我曾经遇到过同样的问题,最终我解决了它。 在ProxyPassMatch设置后面尝试添加以下内容:
ProxyErrorOverride on

顺便提一下,请不要忘记你的

密码


ErrorDocument 404 /path/to/file

设置。

感谢注意到这个必须添加在ProxyPassMatch之后。是否有一种方法可以为所有vhost设置这个? - marcovtwout
尝试一下从来不会有坏处 :) 您可以在主要的httpd conf中设置ProxyErrorOverride并查看是否有效。 - Shiqi Zhong
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Shiqi Zhong
我只是想问:我能不能只设置一次“ProxyErrorOverride on”?然后它就可以工作了 :) - marcovtwout
哦,抱歉!......这是个笔误......我应该说“ProxyErrorOverride”而不是“ProxyPassMatch”。 - Shiqi Zhong

0

由于在apache / php-fpm进程中可能会出现许多问题,因此许多错误可能会导致响应

"文件未找到"并在日志中出现"AH01071:收到错误'Primary script unknown\n'":(路径中的双斜杠,权限等)

要跟踪它们,您可以:

  • 在您的apache配置中放置"LogLevel debug"并检查错误日志。
  • 和/或将您的配置暂时还原为"仅尝试简单的apache",在我的情况下,这导致了权限问题(www 0751需要是0755)错误,这之前是看不见的。

附注:在另一个线程上要小心,人们说使用ProxyErrorOverride是"真的很糟糕的想法":Server Fault | Apache 2.4 + PHP-FPM + ProxyPassMatch


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接