WSOD를 대체하는 친숙한 오류 페이지


10

가장 쉬운 방법이지만, 어떤 이유로 든 할 수 없습니다.

불쾌한 500 시나리오를 대체하기 위해 친숙한 정적 오류 페이지를 얻으려고합니다. 지금은 내 테마의 template.php 상단에 일부 쓰레기 문자를 던져 내 로컬 컴퓨터 (MAMP에서 실행되는 Drupal 7)에서 500 상황을 복제하려고합니다. 이는 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는 자체 오류 페이지를 제공합니다. 블록 내에서 특정 오류를 수신하면 Drupal에 HTTP 500 상태 헤더와 함께 사용자 정의 오류 페이지로 리디렉션하도록 지시 할 수 있습니다 try...catch.

그러나 일부 WSOD는 시스템 수준에서 발생할 수 있으며 치명적인 오류가 발생하여 실행을 즉시 중지하고 실행을 방해 catch할 수 있습니다. 예를 들어 데이터베이스가 특정 크기의 쿼리를 처리하도록 제대로 조정되지 않은 경우 (예 : 기능이 모든 작업을 되돌릴 때와 같이)-데이터베이스가 중단되어 insta-WSOD가 제공 될 수 있습니다.

가장 좋은 방법은 아파치, MySQL 및 PHP 오류 로그를 확인하고 WSOD의 근본 원인을 사례별로 분리하려고 시도하는 것입니다. 오류 페이지. 일반적으로 500 개의 서버 오류 페이지를 발생시키는 오류는 피할 수 없으며 프로덕션 환경에서 사용자 정의 서버 오류 페이지를 갖는 것이 가능하지만 WSOD가 실제로 발생하는 것은 아닙니다.

서버 오류 페이지가 올바르게 설정되어있는 것 같습니다. 일반적인 서버 오류 페이지! = WSOD를 구별하기 만하면됩니다. 높은 트래픽 및 리소스 병목 현상으로 인해 서버 오류 페이지가 트리거 될 수 있지만 실제로 프로덕션 기간 동안 WSOD가 발생하지 않아야합니다. 이는 일반적으로 코딩, 최적화 또는 구성이 좋지 않기 때문에 발생합니다. 여전히 WSOD가 표시되면 반창고 적용과는 반대로 문제의 근본 원인을 먼저 찾아서 해결하십시오.


4
답변 주셔서 감사합니다. 근본 원인 / 증상 치료에 대해 당신은 절대적으로 옳습니다. 그러나 서비스 수명 기간 동안 오류가 발생하고 빈 페이지 나 흰색의 일반 검은 색보다는 사용자에게 상황을 잘 전달하는 것이 항상 더 좋기 때문에 멋진 오류 페이지의 필요성과 관련이 없습니다. "서버 오류"페이지. 트위터는 예를 들어 고래 실패입니다. 따라서 전문적인 오류 프로파일 링이 필요하지 않지만 그 동안 사용자의 분노가 줄어 듭니다.
— Tommi Forsström

1
또한이 경우 데이터베이스 충돌 여부에 관계없이 응용 프로그램 계층의 오류에 대한 포괄적 인 메커니즘이 필요하기 때문에 (http 서버 아래에있는 한) 오류가 발생하는 계층을 구별 할 필요가 없습니다. 누군가가 불량 코드를 커밋하고 (테스트 범위를 통과 한 경우) 상상할 수 있지만 예기치 않은 오류 상황이 발생합니다. 그러나 질문에서 업데이트 된 것처럼 Acquia의 dev 클라우드는 현재 500 시리즈 오류 페이지 사용자 정의를 지원하지 않기 때문에 현재로서는 관련이 없습니다.
— Tommi Forsström

"Acquia의 개발 클라우드는 현재 500 시리즈 오류 페이지 사용자 정의를 지원하지 않습니다." 으아 아아아, 잘 알아.
— 아마추어 바리 스타

Acquia의 강력한 Dev Cloud로 연고에서 거의 유일한 비행 물이지만 가까운 시일 내에이를 구현할 수도 있습니다. Dev Cloud에 대해 충분히 말할 수 없습니다. Drupal 서비스를 실행할 수있는 놀라운 플랫폼입니다!
— Tommi Forsström

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로 설정하십시오. AllowOverride아파치에서 config가 켜져 있어야 함을 기억하십시오 .


ErrorDocumentDrupal에서 500 개의 응답에 대한 지시문을 설정해도 테스트에서 작동하지 않습니다
— cdmo

Drupal에서는 일반적으로 500 개의 오류를 설정할 수 없습니다. Apache를 사용하는 경우 Drupal-.htaccess에서 설정해야합니다. NGINX에서-업데이트 된 티켓을 참조하십시오.
— Alexei Rayu

그게 내 뜻이야 Drupal 사이트에서 실제로 작동하도록 htaccess 또는 vhost 구성에서 500 오류 세트에 대한 ErrorDocument 지시문을 얻을 수 있습니까? Drupal은 오류 처리를 대신합니다.
— cdmo

0

오류보고 기능을 설정 했습니까? (관리자 / 설정 / 개발 / 로깅 -> 설정 모든 메시지 에 대한 디스플레이에 오류 메시지 )

기본적으로 Drupal은 WSOD를 보안 기능으로 표시합니다.


충분히 재미있어, 켜져 있고 여전히 WSOD를 얻습니다.
— Tommi Forsström 2016 년

이 경우 Drupal 문제가 아닌 MAMP 문제 일 수 있습니다. php.ini에서 오류보고 기능을 켜보십시오 ( forum.mamp.info/viewtopic.php?f=2&t=8077 ) 오류 표시는 기본적으로 MAMP에서 비활성화되어 있습니다.
— 패트릭 케니

1
PHP 오류가 잘 표시 될 수 있습니다. 그것은 실제로 문제가 아닙니다. Twitter의 Fail Whale과 같은 오류가 발생했을 때 친절한 것을 표시하고 싶습니다. 그것은 내가 일어날 수없는 것입니다 : 500 시리즈 오류에 대한 사용자 정의 오류 페이지.
— Tommi Forsström 2016 년

0

대답은 "문서를 읽은 것"이라고 생각합니다. https://www.drupal.org/node/195435

그래서 기본적으로 명명 된 템플릿 파일을 만들 수 있습니다 maintenance-page.tpl.php및 maintenance-page--offline.tpl.php에서 하드 코드 일부 설정을 settings.php.

편집하다:

수준이 무엇인지 상관하지 않는 것 error_reporting또는 사용자가 설정 한 여부 설정 display_errors에 on나 off. 당신은이 때 maintenance-page--offline.tpl.php데이터베이스가 사라질 때 드루팔이 페이지를 표시 할 위치에 파일을. 또한 /admin/config/development/logging관리자 측에서 설정 한 내용은 중요하지 않습니다 . OP의 상황 인 구문 오류가있는 경우 실제로 500을 트리거하지는 않지만 php.ini display_error세트 에 따라 PHP 오류가 표시되거나 숨겨지는 200입니다 . 필요에 따라 사용자 정의 코드 전체에 사용자 정의 오류 처리 논리를 추가하는 것 외에는 내가 아는 방법이 없습니다.


내가 왜 다운 보트를 받았는지 잘 모르겠습니다. 이것은 현상금을 설정할 때 내가 찾은 답입니다. OP가 아닌 다른 하나는 error_prepend를 설정하고 표준 오류 페이지를 더 자세히 설명하려는 경우 표준 PHP 오류 통지에 추가 할 수 있습니다.
— cdmo

0

모든 WSOD를 다른 것으로 교체하려면 해킹 코어가 필요합니다.이 작업 을 원하지 않습니다 . Drupal은 bootstrap.inc 및 errors.inc에 자체 오류 처리기를 정의합니다. 해당 코드로 혼란스러워했다면 실행이이 단계에 도달했을 때 잘못 될 수있는 모든 사항 (데이터베이스, 테마 엔진, 테마 없음, 구성 없음 등)을 고려해야합니다.


PHP의 error_append 및 error_prepend 옵션을 사용해 보셨습니까? 오류 메시지가 여전히 표시되지만 훨씬 더 나은 500 경험을 제공 할 수있는 것 같습니다 (허가 됨, 흰색 화면을 기술적으로 만드는 모든 PHP 오류가 많은 구문 오류와 같이 500 응답을 일으키는 것은
— 아닙니다

진실. 어느 쪽이든 당신은 같은 일반적인 지점으로 당신을 얻을 수 있습니다 : 당신은 그렇게 할 수 없습니다.
— 곡예사

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.