WSOD'yi değiştirmek için kolay hata sayfası


10

Bu yapılacak en kolay şey olmalı, ama nedense bunu yapamıyorum.

Kötü 500 senaryo yerine bir dostu statik hata sayfası almaya çalışıyorum. Şimdilik, şablonumun üstüne bazı bok karakterleri atarak temamda 500 durumu tetikleyen yerel makinemde (MAMP'ta çalışan Drupal 7) 500 durumu kopyalamaya çalışıyorum, ancak .htaccessveya Apache yapılandırma dosyamdaki ErrorDocument yönergesinin bir etkisi yoktur.

Yaptığım şey oldukça basit:

ErrorDocument 500 /500.html

Ve sitemin kökünde 500.html adıyla şimdiye kadarki en basit statik html sayfası var.

Yine de, template.php'yi kasten kırdığımda, güzel dost hata sayfam yerine korkunç Beyaz Ekran Ölümünü alıyorum.

Burada neyi yanlış yapıyorum? Bunu Drupal olmayan kurulumlarda milyarlarca kez yaptım ama başımı bunun etrafında bulamıyorum.


GÜNCELLEME : Bu soruların şu anki özel kullanım durumumda neredeyse gereksiz olduğu anlaşılıyor, çünkü Acquia'nın söz konusu uygulamayı çalıştırmak için kullandığımız Dev Cloud şu anda 500 serisi hata sayfalarının özelleştirilmesini bile desteklemiyor. Yakında buna destek vereceklerini umuyoruz.


drupal_add_http_header('Status', '503 Service Unavailable');500.html'nize eklerseniz ne olur ?
amatör barista

Yanıtlar:


2

500 hata sayfası kesinlikle sunucu hata sayfasıdır. Sunucu PHP'ye yürütmeyi bıraktığında, Drupal / PHP kendi hata sayfalarını sunmaktan sorumludur. Bir try...catchblok içinde belirli hatalar aldığında, Drupal'a kullanıcıyı bir HTTP 500 durum üstbilgisiyle birlikte özel bir hata sayfasına yönlendirmesini söylemeyi deneyebilirsiniz .

Ancak, not muhtemelen hemen durur yürütme ve önlemek bazı WSODs sistem düzeyinde ortaya çıkabilir ve bunlar ölümcül hataya neden olabilir catchyürütülecek . Bunun bir örneği, veritabanınızın belirli boyuttaki sorguları işlemek için uygun şekilde ayarlanmamış olmasıdır (bir Özellik tüm işlemi geri döndürürken olduğu gibi) - veritabanı size boğularak insta-WSOD verebilir.

En iyi şey, apache, MySQL ve PHP hata günlüklerinizi kontrol etmek ve güzel bir şekilde örtbas etmeye çalışmak yerine WSOD'nin kök nedenini vaka bazında izole etmeye çalışmak olduğunu söyleyebilirim. hatalı sayfa. Tipik 500 sunucu hata sayfalarına neden olan hatalar bazen kaçınılmaz olsa da ve üretimde özel sunucu hata sayfalarına sahip olmak mümkün olsa da, WSOD'lerin canlı olarak gerçekleşmesi mümkün değildir.

Görünüşe göre sunucu hata sayfalarınız doğru şekilde ayarlanmış. Sadece tipik sunucu hata sayfaları! = WSODs ayrım yapmak gerekir. Sunucu hata sayfaları, yüksek trafik ve kaynak darboğazları nedeniyle tetiklenebilir, ancak WSOD'lerin üretim sırasında gerçekten gerçekleşmemesini sağlamalısınız. Bunlar tipik olarak zayıf kodlama, optimizasyon veya yapılandırma nedeniyle olur. Hâlâ bir WSOD görüyorsanız, bir bant yardımı uygulamaya çalışmanın aksine, sorunun temel nedenini bulduğunuzdan (ve çözdüğünüzden) emin olun.


4
Cevabınız için teşekkürler. Temel neden / semptomları tedavi etme konusunda kesinlikle haklısınız. Ancak bu, güzel hata sayfalarının gerekliliği ile alakasızdır, çünkü bir hizmetin ömrü boyunca hatalar meydana gelecektir ve bu durumlarda durumu boş sayfalar veya beyaz üzerine genel siyahtan ziyade kullanıcılara güzelce iletmek her zaman daha iyidir "sunucu hatası" sayfaları. Twitter balina başarısız bir örnek. Bu, profesyonel hata profili oluşturma ihtiyacını ortadan kaldırmaz, ancak bu arada kullanıcıları daha az öfkelendirir.
Tommi Forsström

1
Ayrıca, bu durumda, veritabanı çöküyor olsun, uygulama katmanındaki hatalar için bir catch-all mekanizmalarına ihtiyaç duyduğumdan, hatanın kaynaklandığı katmanları (http sunucusunun altında olduğu sürece) ayırt etmeye gerek yoktur. , bok kodu yapan biri (ve test kapsamımızı geçen) ve akla gelebilecek henüz beklenmeyen diğer hata durumları. Ancak soruda güncellendiği gibi, şu anda benim için önemsiz çünkü Acquia'nın dev bulutu şu anda 500 serisi hata sayfalarının özelleştirilmesini desteklemiyor.
Tommi Forsström

"Acquia'nın dev bulutu şu anda 500 serisi hata sayfalarının özelleştirilmesini desteklemiyor." Ahh, bunu bilmek güzel.
amatör barista

Her ne kadar Acquia'nın güçlü Dev Cloud'uyla merhemdeki tek sinek bu ve yakın gelecekte bunu da uygulayabilirler. Dev Cloud için yeterince konuşamıyorum. Drupal hizmetlerini çalıştırmak için inanılmaz bir platform!
Tommi Forsström

1

Php.ini dosyasında hata bildirimini kapattığınız için WSOD alıyorsunuz. Bu bir güvenlik sorunudur - bir hatayla karşılaşırsanız ve bilgisayar korsanı ne olduğunu görürse, siteyi hacklemek için potansiyel olarak kullanabilir.

Hatayı durdurmak istiyorsanız, php.ini dosyasında hataları göstermeyi etkinleştirmeniz gerekir (örnek yalnızca ciddi hatalar gösterecektir):

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

Ve sonra, htaccess dosyasındaki hata belgelerini ayarlayabilirsiniz:

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

Alternatif olarak, hataları Drupal'ın settings.php dosyasında belirleyebilirsiniz.

NGINX'te:

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

Apache'yi MAMP'de çalıştırdığınız için .htaccess olarak ayarlayın. AllowOverrideApache config'te açık olması gerektiğini unutmayın (genellikle açıktır).


ErrorDocument
Drupal'da

500 Hatalar genellikle Drupal'da ayarlanamaz. Apache kullanıyorsanız Drupal - in .htaccess'ten önce ayarlanması gerekir. NGINX'te - güncellenmiş bilete bakın.
Alexei Rayu

Demek istediğim şey o. Bir htaccess'te ayarlanan 500 hata için bir ErrorDocument yönergesi alabildiniz mi veya bir Drupal sitesi için çalışacak bir vhost yapılandırması mı aldınız? Deneyimlerimde bu direktifler göz ardı edildi, Drupal hata işlemeyi devraldı.
cdmo

0

Hata raporlamayı etkinleştirdiniz mi? (admin / config / development / logging -> Hata mesajlarının görüntülenmesi için tüm mesajları ayarla )

Varsayılan olarak, Drupal güvenlik özelliği olarak bir WSOD gösterir.


Yeterince komik, bu açık ve hala WSOD alıyorum.
Tommi Forsström

Bu durumda Drupal sorunu değil, muhtemelen bir MAMP sorunu vardır. Php.ini dosyasında hata raporlamayı açmayı deneyin ( forum.mamp.info/viewtopic.php?f=2&t=8077 ) Hata göstergesi MAMP'te varsayılan olarak devre dışıdır.
Patrick Kenny

1
Ben iyi görüntülenen php hataları alabilirsiniz. Sorun bu değil. Twitter'ın Başarısız Balinası gibi hatalar meydana geldiğinde dostça bir şey gösterebilmek istiyorum. Yapamadığım şey bu: 500 serisi hatalar için özel hata sayfaları.
Tommi Forsström

0

Sanırım cevap "belgeleri okumak", bkz. Https://www.drupal.org/node/195435

Temelde adında şablon dosyaları maintenance-page.tpl.phpve maintenance-page--offline.tpl.phpbazı ayarları sabit kod oluşturabilirsiniz settings.php.

DÜZENLE:

Seviye ne olursa olsun görünmüyor error_reportingveya ayarladığınız olmadığını ayarlanır display_errorsiçin onya off. maintenance-page--offline.tpl.phpYerinde bir dosya olduğunda, veritabanı kaybolduğunda Drupal bu sayfayı görüntüler. /admin/config/development/loggingYönetici tarafında ne ayarladığınız da önemli değil . OP'nin durumu olan ve aslında 500'ü tetiklemeyen sözdizimi hatalarınız varsa, php.ini display_errorkümeye göre görüntülenen veya gizlenen bir PHP hatası olan bir 200'dür . Bildiğim, özel hata işleme mantığınızı özel kodunuza gerektiği gibi eklemek dışında bir yolu yok.


Neden burada reddedildiğimden emin değilim, bu ödülü ayarladığımda aradığım cevap bu. OP için değil, hata_prepend ayarlayabilir ve standart hata sayfanızı daha ayrıntılı olarak incelemek isterseniz standart PHP hata bildirimlerine ekleyebilirsiniz.
cdmo

0

Çekirdek hack gerektirecektir başka bir şeyle bütün WSOD değiştirmek için: do not bunu yapmak istiyor. Drupal, bootstrap.inc ve error.inc dosyasında kendi hata işleyicilerini tanımlar. Bu kodla uğraşacak olsaydınız, yürütme bu aşamaya ulaştığında (veritabanı, tema motoru, tema yok, yapılandırma yok, vb.) Yanlış olabilecek tüm şeyleri hesaba kattığınızdan emin olmanız gerekir.


Hiç PHP'nin error_append ve error_prepend seçeneklerini kullanmaya çalıştınız mı? Hata mesajı görüntülenmeye devam ederken, çok daha güzel bir 500 deneyim sunabileceğiniz gibi görünüyor (bir beyaz ekranı teknik olarak 500 yanıta neden olan tüm PHP hataları değil, birçok sözdizimi hatası gibi).
CDModa

Doğru. Her iki şekilde de sizi aynı genel noktaya götürür: bunu yapamazsınız.
acrosman

0

Bunu yapmak için bir sanal alan projesi yaptım .

Ben /src/EventSubscriber/fivehundredEventSubscriber.php içinde HttpExceptionSubscriberBase genişleterek bunu başardı

    <?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','');
      }


    }
?>

Ve hizmeti module.services.yml dosyasına eklemeniz gerekir.

services:
  five_hundred.:
    class: Drupal\five_hundred\EventSubscriber\five_hundredEventSubscriber
    arguments: ['@request_stack']
    tags:
      - { name: event_subscriber }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.