WSODを置き換えるわかりやすいエラーページ


10

これは最も簡単なことですが、何らかの理由でそれを行うことができません。

厄介な500シナリオを置き換えるために、わかりやすい静的エラーページを取得しようとしています。今のところ、テーマのtemplate.phpの上部にいくつかのがらくたの文字をスローすることにより、ローカルマシン(MAMPで実行されているDrupal 7)で500シチュエーションを複製しようとしています。何らかの理由で、私の.htaccessまたはApacheの構成ファイルのErrorDocumentディレクティブが機能しません。

私がやっていることはこれだけです:

ErrorDocument 500 /500.html

そして、私は自分のサイトのルートに500.htmlという名前の最も単純な静的htmlページを置いています。

それでも、template.phpを故意に破壊すると、フレンドリーでわかりやすいエラーページではなく、恐ろしい死の白い画面が表示されます。

ここで何が悪いのですか?私はこれをDrupal以外のセットアップで10億回実行しましたが、これに頭を悩ませることはできません。


更新:問題のアプリケーションを実行するために使用するAcquiaのDev Cloudは、現時点では500シリーズのエラーページのカスタマイズもサポートしていないため、この質問は私の特定のユースケースではかなり冗長です。彼らがそのサポートをすぐに実装することを期待しています。


drupal_add_http_header('Status', '503 Service Unavailable');500.htmlに追加するとどうなりますか?
アマチュアバリスタ

回答:


2

500エラーページは、厳密にサーバーエラーページです。サーバーが実行をPHPに渡すと、Drupal / PHPは独自のエラーページを提供する責任があります。ブロック内で特定のエラーを受け取ったときに、HTTP 500ステータスヘッダーと共に、ユーザーをカスタムエラーページにリダイレクトするようにDrupalに指示することもできtry...catchます。

しかし、ノートおそらくすぐに停止し、実行しては防ぐことを、いくつかのWSODsは、システムレベルで発生する可能性があり、彼らは致命的なエラーを引き起こす可能性があることをcatch実行します。これの1つの例は、特定のサイズのクエリを処理するようにデータベースが適切に調整されていない場合です(機能がすべての操作を元に戻すときなど)-データベースが停止し、insta-WSODが表示される場合があります。

最善の方法は、Apache、MySQL、およびPHPのエラーログを確認し、かなりの量でWSODをカバーするのではなく、ケースバイケースでWSODの根本原因を特定することです。エラーページ。典型的な500サーバーエラーページの原因となるエラーは避けられないことがあり、カスタムサーバーエラーページを本番環境で使用することは可能ですが、WSODをライブで実行することは不可能です。

サーバーエラーページが正しく設定されているようです。典型的なサーバーエラーページを!= WSODと区別する必要があるだけです。トラフィックとリソースのボトルネックが多いためにサーバーエラーページがトリガーされる可能性がありますが、本番環境でWSODが実際に発生するべきではありません。これらは通常、不十分なコーディング、最適化、または構成が原因で発生します。それでもWSODが表示される場合は、バンドエイドを適用するのではなく、まず問題の根本原因を見つけて解決してください。


4
ご回答有難うございます。あなたは根本的な原因/症状の治療について完全に正しいです。ただし、これはサービスの有効期間中にエラーが発生するという事実であり、空白ページや一般的な白地の黒ではなく、ユーザーに状況をうまく伝える方が良いため、素敵なエラーページの必要性とは無関係です。 「サーバーエラー」ページ。ツイッターは例としてクジラを失敗させます。それによってプロのエラープロファイリングの必要性がなくなるわけではありませんが、暫定的には、ユーザーの怒りは少なくなります。
TommiForsström12年

1
また、この場合、データベースがクラッシュしているかどうかに関係なく、アプリケーション層のエラーのキャッチオールメカニズムが必要なだけなので、エラーが発生した層を(httpサーバーの下にある限り)区別する必要はありません。 、がらくたコードをコミットしている人(そして私たちのテストカバレッジをパスしている人)とその他の考えられるまだ予期しないエラー状況。しかし、質問で更新されたように、現時点ではAcquiaの開発クラウドは500シリーズのエラーページのカスタマイズをサポートしていないため、これは私には関係ありません。
TommiForsström12年

「Acquiaの開発クラウドは、現時点では500シリーズのエラーページのカスタマイズをサポートしていません。」ああああ、それは知っておくと良い。
アマチュアバリスタ

それはAcquiaの強力なDev Cloudを備えた軟膏のほとんど唯一のフライですが、近い将来にこれを実装する可能性もあります。Dev Cloudについて十分に話すことはできません。Drupalサービスを実行するための素晴らしいプラットフォームです!
TommiForsström、2012

1

php.iniでエラー報告をオフにしたため、WSODを取得しています。これはセキュリティの問題です。エラーが発生し、ハッカーがそれを見つけた場合、ハッカーはサイトをハッキングするためにそれを使用する可能性があります。

ただし、エラーをインターセプトする場合は、php.iniでエラーの表示を有効にする必要があります(この例では重大なエラーのみが表示されます)。

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

次に、htaccessファイルにエラードキュメントを設定できます。

ErrorDocument 401 http://yourwebsite.com/error-401
ErrorDocument 403 http://yourwebsite.com/error-403
ErrorDocument 500 http://yourwebsite.com/error-500

または、Drupalのsettings.phpファイルでエラーを指定することもできます。

NGINXの場合:

error_page 403 = /error.php?code=403;   
error_page 404 = /error.php?code=404;
error_page 500 = /error.php?code=500;

MAMPでApacheを実行しているので、.htaccessに設定します。AllowOverrideApacheではconfigがオンになっていることを覚えておいてください(通常はオンです)。


ErrorDocumentDrupalで500応答のディレクティブを設定しても、私のテストでは機能しません
cdmo

500エラーは通常、Drupalでは設定できません。Drupalの前に設定する必要があります-Apacheを使用する場合は.htaccessに。NGINX-更新されたチケットを参照してください。
Alexei Rayu 16

そういう意味です。Drupalサイトで実際に機能するように、htaccessまたはvhost構成で設定された500エラーのErrorDocumentディレクティブを取得できましたか?これらのディレクティブは私の経験では無視され、Drupalがエラー処理を引き継ぎます。
cdmo 2016

0

エラー報告をオンにしましたか?(admin / config / development / logging-> 表示するエラーメッセージのすべてのメッセージを設定)

デフォルトでは、Drupalはセキュリティ機能としてWSODを表示します。


面白いことに、それはオンになっていて、私はまだWSODを取得しています。
TommiForsström12年

その場合、それはおそらくMAMPの問題であり、Drupalの問題ではありません。php.ini(forum.mamp.info/viewtopic.php?f=2&t=8077)でエラー報告をオンにしてみてください。エラー表示はMAMPではデフォルトで無効になっています。
Patrick Kenny

1
私はphpエラーをうまく表示させることができます。それは本当に問題ではありません。エラーが発生したときに、TwitterのFail Whaleのようなわかりやすいものを表示できるようにしたいと考えています。それが私には起こり得ないことです。500シリーズエラーのカスタムエラーページです。
TommiForsström12年

0

答えは「ドキュメントを読む」だと思います。https: //www.drupal.org/node/195435を参照してください

だから、基本的には名前のテンプレートファイルを作成することができますmaintenance-page.tpl.phpし、maintenance-page--offline.tpl.php中にいくつかの設定をハードコードsettings.php

編集:

どのようなレベルの問題ではしていないようerror_reportingに設定されているか、あなたが設定されているかどうかdisplay_errorsonoff。あなたが持っているときmaintenance-page--offline.tpl.phpの場所にファイルをデータベースがなくなったときにDrupalは、このページが表示されます。また/admin/config/development/logging、管理者側で何を設定したかは関係ありません。OPの状況である構文エラーがあるだけで、実際には500がトリガーされない場合は、200であり、php.ini display_errorセットに基づいて表示または非表示のPHPエラーが発生します。必要に応じてカスタムコード全体にカスタムエラー処理ロジックを追加する以外に方法はありません。


なぜ私がここで反対票を投じたのかわからない、これは私が賞金を設定したときに私が探していた答えです。OP向けではないもう1つの方法として、標準エラーページをさらに詳しく作成したい場合は、error_prependを設定して標準PHPエラー通知に追加することもできます。
cdmo 2016

0

すべてのWSODを別のものに置き換えるには、コアをハッキングする必要があります。これを行う必要はありません。Drupalは独自のエラーハンドラーをbootstrap.incとerrors.incで定義しています。そのコードをいじる場合は、実行がこの段階に達したときに問題になる可能性のあるすべてのこと(データベースなし、テーマエンジンなし、テーマなし、設定なしなど)を確実に説明する必要があります。


PHPのerror_appendおよびerror_prependオプションを使用しようとしたことがありますか?エラーメッセージは引き続き表示されますが、500エクスペリエンスをより優れたものにできるようです(多くの構文エラーのように、ホワイトスクリーンが技術的に500応答を引き起こすすべてのPHPエラーではありません。)
cdmo

そうだね。どちらの方法でも、同じ一般的なポイントに到達できます。それはできません。
アクロマン16/07/11

0

これを行うためのサンドボックスプロジェクトを作成しました。

/src/EventSubscriber/fivehundredEventSubscriber.php のHttpExceptionSubscriberBaseを拡張することでこれを実現できました

    <?php
namespace Drupal\five_hundred\EventSubscriber;

use Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\Serializer\SerializerInterface;

class five_hundredEventSubscriber extends HttpExceptionSubscriberBase {

      public function __construct($stack) {

        if(
          (
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getCode() == 500
          )||(
            null !== $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode()
            && $stack->getCurrentRequest()->attributes->get('exception')->getStatusCode() == 500
          )
        ){
            $response = new Response();
            $errorDocumentHtml = 'html here';
            $response->setContent($errorDocumentHtml);
            $response->setStatusCode(500, '500 Internal Server Error');
            $response->send();
            die();
        }
      }

      /**
       * {@inheritdoc}
       */
      protected function getHandledFormats() {
        return array('html','');
      }


    }
?>

そして、あなたはあなたのmodule.services.ymlにサービスを追加する必要があります

services:
  five_hundred.:
    class: Drupal\five_hundred\EventSubscriber\five_hundredEventSubscriber
    arguments: ['@request_stack']
    tags:
      - { name: event_subscriber }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.