【问题标题】:Apache 2.4 + PHP-FPM, catching error pagesApache 2.4 + PHP-FPM,捕捉错误页面
【发布时间】:2014-11-06 05:50:52
【问题描述】:

这是我的虚拟主机文件:

 <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. 的响应.

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

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

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

【问题讨论】:

    标签: apache php


    【解决方案1】:

    我以前也有同样的问题,终于解决了。

    尝试在 ProxyPassMatch 设置后添加:

    ProxyErrorOverride on
    

    顺便说一句,别忘了你的

    ErrorDocument 404 /path/to/file
    

    设置。

    【讨论】:

    • 感谢您注意这必须在 ProxyPassMatch 之后添加。有没有办法为所有虚拟主机设置一次?
    • 试一试总不会有什么坏处 :) 你可以在 httpd 主配置中设置 ProxyErrorOverride 看看它是否有效..
    • 好的,我尝试将 ProxyPassMatch 语句放在主 httpd conf 文件中,它适用于所有虚拟主机。顺便提一下,如果你想为不同的虚拟主机设置不同的错误页面,你需要在 vhost conf 中显式设置 ErrorDocument 指令。
    • 我的意思是:我可以设置一次“ProxyErrorOverride on”吗?它有效:)
    • 哦,对不起!......这是一个错字......我应该说“ProxyErrorOverride”而不是“ProxyPassMatch”
    【解决方案2】:

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

    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>
    

    【讨论】:

    • 不知道为什么这没有被更多人赞成...似乎是允许 apache 的 ErrorDocument 处理 404 错误的正确方法,同时还允许在 php 中使用 http_response_code(),而 ProxyErrorOverride On 会干扰(因为 apache 会看到 php 抛出 4xx/5xx 代码然后进行干预)。
    【解决方案3】:

    由于apache / php-fpm过程中会出现很多问题,很多错误都会导致响应

    “找不到文件”和日志中的“AH01071: Got error 'Primary script unknown\n'”:(路径、权限中的双斜杠...)

    要跟踪它们,您可以:

    • 放入你的apache配置“LogLevel debug”并检查错误日志。
    • 和/或将您的配置临时恢复为“仅尝试简单的 apache”,在我的情况下,它会导致我出现以前不可见的权限问题(www 0751 必须是 0755)错误。

    Ps:请注意其他线程,人们说为此使用 ProxyErrorOverride “真是个坏主意”:Server Fault | Apache 2.4 + PHP-FPM + ProxyPassMatch

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2015-05-16
      • 2013-06-05
      • 2014-08-05
      • 2012-01-20
      • 2014-04-24
      • 2016-06-10
      • 2014-04-18
      • 2010-11-25
      相关资源
      最近更新 更多