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.phpmaintenance-page--offline.tpl.php에서 하드 코드 일부 설정을 settings.php.

편집하다:

수준이 무엇인지 상관하지 않는 것 error_reporting또는 사용자가 설정 한 여부 설정 display_errorsonoff. 당신은이 때 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.