当前位置: 首页 > 知识库问答 >
问题:

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

柴嘉年
2023-03-14

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

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

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

然而,由于Apache将所有事情都交给了php fpm,因此它似乎没有正确地处理这些错误。


共有3个答案

韩刚洁
2023-03-14
匿名用户

对于今天阅读的人来说,这里是正确的答案,感谢蒂托1337的回答。

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

相反,只有当文件存在时,您才应该将请求传递给php-fpm。如果该文件不存在,Apache将直接指向您定义的ErrorDocum。您可以在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>

壤驷德宇
2023-03-14

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

“找不到文件”和日志“AH01071:出现错误'Primary script unknown\n'”(路径、权限中的双斜杠…)

要跟踪它们,您可以:

  • 输入apache配置“logleveldebug”并检查错误日志
  • 和/或将您的临时配置还原为“simple apache only try”,在我的情况下,这会导致权限问题(www 0751需要是0755)错误,而之前该错误是不可见的

Ps:注意另一个线程,人们说使用ProxyErrorOverride来实现这一点“真是个坏主意”:服务器故障| Apache 2.4 PHP-FPM ProxyPassMatch

祁雪峰
2023-03-14

我以前也有同样的问题,最后我把它修好了。

尝试在ProxyPassMatch设置之后添加此选项:

ProxyErrorOverride on

顺便说一句,不要忘记你的

ErrorDocument 404 /path/to/file

设置。

 类似资料:
  • 我无法用axios捕捉错误响应。怎么做?我用的是: 我看到ajax请求的结果有400个状态代码,响应主体看起来像(Django后端)。没关系,我已经准备好在catch处理程序中处理这些错误了。 但是它们转到成功处理程序。为何如此?我在控制台中看到以下输出: 成功处理程序接收axios错误对象作为结果。为什么会这样,下一步该怎么办?此错误对象不包含任何有用信息。 UPD。实际上,错误对象包含有用的信

  • 我有一个应用程序使用了log4j1.2.17,现在我想把它更改为log4j2。所以我更改了pom.xml(我确信我已经删除了任何依赖项中的log4j1),添加了log4j2.xml。log4j2工作得很好,它记录了我想要的信息。 我查看log4j的问题。LOG4J2-2026似乎可以解决这个问题,但是我使用的log4j2版本已经是2.9.1了。我不知道是什么原因造成这个错误。

  • 我现在必须学习通过fire base编写移动应用程序web服务。我点击了这个链接:https://firebase-php.readthedocs.io/en/stable/ 在我的核心网站中,我创建web服务文件夹,然后创建我的fire。php文件。这个文件代码在这里, 我得打电话给我的支持档案:https://github.com/kreait/firebase-php/ 但我还是得到了一个:

  • 问题内容: 基本上,我必须创建一个JavaScript APP对象,该对象将对服务器的一系列异步请求进行排队,处理对JSON的响应,并记录其中的错误。 JSON处理错误很容易通过“ try-catch”捕获,但是服务器错误(如404、500等)仍显示在浏览器的控制台中,而我需要将其静默记录在“ APP.history”中。 我尝试通过下面的代码实现它,但是404错误均未触发一个错误。我究竟做错了什

  • 本文向大家介绍浅谈PowerShell 捕获错误,包括了浅谈PowerShell 捕获错误的使用技巧和注意事项,需要的朋友参考一下 之前的文章我们演示了如何使用 Windows PowerShell 构建相当高级的清单工具。我创建的工具提供了多个有关输出的选项,这应归功于外壳的内置功能和将函数应用于对象。 我所创建的函数有一个无可否认的弱点:它不能适度处理可能发生的任何错误(例如连接或权限问题)。

  • 我正在使用以下代码向Laravel发布一些内容: (不相关代码省略) 当Laravel返回200时,这总体上是有效的。如果我从Laravel Axios返回401、422或其他东西,会在控制台中抛出一个错误,整个方法将停止运行。 我一直认为这是一种非常不利于开发人员的行为——我不明白吗?从后端API返回不同的状态代码应该有助于读取Vue中的响应,但Vue/Axios将每个非200响应视为致命错误。