Halaman kesalahan ramah untuk menggantikan WSOD


10

Ini seharusnya menjadi hal yang paling mudah untuk dilakukan, tetapi untuk beberapa alasan saya tidak bisa menyelesaikannya.

Saya mencoba untuk mendapatkan halaman kesalahan statis yang ramah untuk menggantikan 500 skenario jahat. Untuk saat ini saya hanya mencoba mereplikasi situasi 500 di komputer lokal saya (Drupal 7 berjalan di MAMP) dengan melemparkan beberapa karakter omong kosong di bagian atas template.php di tema saya, yang memicu 500 situasi, tetapi untuk beberapa alasan direktif ErrorDocument di .htaccessfile konfigurasi saya atau Apache tidak berpengaruh.

Yang saya lakukan cukup sederhana ini:

ErrorDocument 500 /500.html

Dan saya memiliki halaman html statis paling sederhana di root situs saya dengan nama 500.html.

Namun, ketika saya dengan sengaja memecah template.php, saya mendapatkan White Screen Of Death yang ditakuti alih-alih halaman kesalahan ramah yang bagus.

Apa yang saya lakukan salah di sini? Saya sudah melakukan ini satu miliar kali dalam pengaturan non-Drupal tetapi tidak bisa mengatasinya.


PEMBARUAN : Tampaknya pertanyaan ini cukup berlebihan dalam kasus penggunaan khusus saya saat ini sebagai Dev Cloud Acquia yang kami gunakan untuk menjalankan aplikasi yang dipermasalahkan bahkan tidak mendukung penyesuaian halaman kesalahan 500-seri saat ini. Kami berharap mereka akan segera mengimplementasikan dukungan untuk itu.


Apa yang terjadi jika Anda menambah drupal_add_http_header('Status', '503 Service Unavailable');500.html Anda?
barista amatir

Jawaban:


2

500 halaman kesalahan hanyalah halaman kesalahan server. Setelah server menyerahkan eksekusi ke PHP, Drupal / PHP bertanggung jawab untuk melayani halaman kesalahan mereka sendiri. Anda dapat mencoba memberi tahu Drupal untuk mengarahkan pengguna ke halaman kesalahan khusus, bersama dengan tajuk status HTTP 500, ketika menerima kesalahan tertentu dalam sebuah try...catchblok.

Namun, perhatikan bahwa beberapa WSOD dapat terjadi pada tingkat sistem dan mereka dapat menyebabkan kesalahan fatal yang segera menghentikan eksekusi dan mungkin mencegah catcheksekusi . Salah satu contohnya adalah ketika basis data Anda tidak disetel dengan benar untuk menangani permintaan ukuran tertentu (seperti ketika melakukan Fitur mengembalikan semua operasi) - database mungkin tersedak, memberi Anda insta-WSOD.

Saya akan mengatakan hal terbaik untuk dilakukan adalah memeriksa apache, MySQL dan PHP error logs Anda, dan mencoba untuk mengisolasi akar penyebab WSOD berdasarkan kasus per kasus, sebagai lawan dari mencoba untuk menutupinya dengan cukup- halaman kesalahan. Sementara kesalahan yang menyebabkan halaman kesalahan 500 server tipikal kadang-kadang tidak dapat dihindari, dan memiliki halaman kesalahan server kustom dalam produksi adalah layak, memiliki WSODs terjadi langsung tidak.

Sepertinya Anda memiliki halaman kesalahan server yang diatur dengan benar. Anda hanya perlu membuat perbedaan bahwa halaman kesalahan server tipikal! = WSODs. Halaman kesalahan server dapat dipicu karena lalu lintas tinggi dan kemacetan sumber daya, tetapi Anda seharusnya tidak benar-benar mengalami WSODs dalam produksi, titik. Ini biasanya terjadi karena pengkodean, optimasi, atau konfigurasi yang buruk. Jika Anda masih melihat WSOD, pastikan Anda menemukan (dan menyelesaikan) akar masalah terlebih dahulu, sebagai lawan dari mencoba menerapkan bantuan band untuk itu.


4
Terima kasih atas jawaban anda. Anda benar tentang akar penyebab / mengobati gejala. Namun ini tidak relevan dengan kebutuhan halaman kesalahan yang bagus karena fakta bahwa selama umur layanan, kesalahan akan terjadi dan dalam situasi itu selalu lebih baik untuk mengomunikasikan situasi kepada pengguna dengan baik daripada dengan halaman kosong atau generik hitam putih. halaman "server error". Twitter gagal sebagai contoh paus. Itu tidak menghapus perlunya profil kesalahan profesional, tetapi sementara itu, membuat pengguna tidak terlalu marah.
Tommi Forsström

1
Juga, untuk kasus ini tidak perlu membedakan antara lapisan dari mana kesalahan berasal (selama itu di bawah server http) karena saya hanya perlu menangkap semua mekanisme untuk kesalahan di lapisan aplikasi, apakah itu database crashing , seseorang melakukan kode omong kosong (dan yang melewati jangkauan pengujian kami) dan situasi kesalahan lain yang mungkin terjadi namun tidak terduga. Tapi seperti yang diperbarui dalam pertanyaan, ini tidak relevan bagi saya saat ini karena cloud dev Acquia tidak mendukung menyesuaikan halaman kesalahan 500-seri saat ini.
Tommi Forsström

"Cloud dev Acquia tidak mendukung menyesuaikan halaman kesalahan 500-seri saat ini." Aww shucks, itu bagus untuk diketahui.
barista amatir

Meskipun itu hampir satu-satunya terbang dalam salep dengan Dev Cloud yang perkasa dari Acquia dan mereka juga mungkin mengimplementasikan ini dalam waktu dekat. Saya tidak bisa berbicara cukup tinggi untuk Dev Cloud. Ini adalah platform luar biasa untuk menjalankan layanan Drupal!
Tommi Forsström

1

Anda mendapatkan WSOD karena Anda menonaktifkan pelaporan kesalahan di php.ini. Ini adalah masalah keamanan - jika Anda memiliki kesalahan dan peretas melihat apa itu, ia berpotensi menggunakannya untuk meretas situs tersebut.

Jika Anda ingin mencegat kesalahan, Anda harus mengaktifkan menampilkan kesalahan di php.ini (contohnya hanya akan menampilkan kesalahan serius):

error_reporting = E_ALL & ~E_NOTICE & ~E_STRICT

Dan kemudian, Anda dapat mengatur dokumen kesalahan di file htaccess:

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

Atau, Anda dapat menentukan kesalahan dalam file settings.php Drupal .

Di NGINX:

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

Karena Anda menjalankan Apache di MAMP, atur di .htaccess. Ingat bahwa AllowOverridedalam apache config harusnya aktif (biasanya itu).


menetapkan ErrorDocumentarahan untuk 500 tanggapan di Drupal tidak berfungsi dalam pengujian saya
cdmo

500 Kesalahan biasanya tidak dapat diatur di Drupal. Mereka harus diatur sebelum Drupal - in .htaccess jika menggunakan Apache. Di NGINX - lihat tiket yang diperbarui.
Alexei Rayu

Itu yang saya maksud. Apakah Anda bisa mendapatkan direktif ErrorDocument untuk 500 kesalahan yang diatur dalam htaccess atau konfigurasi vhost agar benar-benar berfungsi untuk situs Drupal? Arahan-arahan itu diabaikan dalam pengalaman saya, Drupal mengambil alih penanganan kesalahan.
cdmo

0

Sudahkah Anda mengaktifkan pelaporan kesalahan? (admin / config / development / logging -> Setel Semua pesan untuk menampilkan pesan Kesalahan )

Secara default, Drupal menunjukkan WSOD sebagai fitur keamanan.


Cukup lucu, itu dinyalakan dan saya masih mendapatkan WSOD.
Tommi Forsström

Dalam hal itu kemungkinan masalah MAMP, bukan masalah Drupal. Coba aktifkan pelaporan kesalahan di php.ini ( forum.mamp.info/viewtopic.php?f=2&t=8077 ) Tampilan kesalahan dinonaktifkan di MAMP secara default.
Patrick Kenny

1
Saya bisa menampilkan kesalahan php dengan baik. Bukan itu masalahnya. Saya ingin dapat menampilkan sesuatu yang ramah ketika kesalahan terjadi, seperti Paus Gagal Twitter. Itulah hal yang tidak dapat saya wujudkan: halaman kesalahan khusus untuk kesalahan 500-seri.
Tommi Forsström

0

Saya kira jawabannya adalah "baca dokumen", lihat https://www.drupal.org/node/195435

Jadi pada dasarnya Anda dapat membuat file template bernama maintenance-page.tpl.phpdan maintenance-page--offline.tpl.phpdan kode keras beberapa pengaturan di settings.php.

EDIT:

Ini tampaknya tidak peduli apa tingkat error_reportingdiatur atau apakah Anda telah menetapkan display_errorsuntuk onatau off. Ketika Anda memiliki maintenance-page--offline.tpl.phpfile di tempat Drupal akan menampilkan halaman ini ketika database hilang. Juga tidak masalah apa yang telah Anda atur di /admin/config/development/loggingsisi admin. Jika Anda hanya memiliki kesalahan sintaks, yang merupakan situasi OP, itu tidak akan benar-benar memicu 500, itu adalah 200 dengan kesalahan PHP baik ditampilkan atau disembunyikan berdasarkan php.ini display_errorset. Tidak ada cara, yang saya tahu, selain menambahkan logika penanganan kesalahan khusus Anda di seluruh kode kustom Anda sesuai kebutuhan.


Tidak yakin mengapa saya dipilih di sini, ini adalah jawaban yang saya cari ketika saya menetapkan hadiah. Satu lagi tidak untuk OP, Anda dapat mengatur error_prepend dan menambahkan pemberitahuan kesalahan PHP standar juga jika Anda ingin menguraikan halaman kesalahan standar Anda lebih lanjut.
cdmo

0

Untuk mengganti semua WSOD dengan hal lain akan membutuhkan inti peretasan: Anda tidak ingin melakukan ini. Drupal mendefinisikan penangan kesalahannya sendiri di bootstrap.inc dan errors.inc. Jika Anda dipusingkan dengan kode itu, Anda harus memastikan Anda memperhitungkan semua hal yang bisa salah ketika eksekusi mencapai tahap ini (tidak ada database, tidak ada mesin tema, tidak ada tema, tidak ada konfigurasi, dll).


Pernah mencoba menggunakan opsi PHP error_append dan error_prepend? Sementara pesan kesalahan masih akan ditampilkan, sepertinya Anda bisa menawarkan pengalaman 500 yang jauh lebih bagus (memang, tidak semua kesalahan PHP yang membuat layar putih secara teknis menyebabkan respons 500, seperti banyak kesalahan sintaks.)
cdmo

Benar. Apa pun cara Anda sampai pada titik umum yang sama: Anda tidak bisa melakukan itu.
aktris

0

Saya membuat proyek kotak pasir untuk melakukan ini.

Saya dapat mencapai ini dengan memperluas HttpExceptionSubscriberBase di /src/EventSubscriber/fivehundredEventSubscriber.php

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


    }
?>

Dan Anda harus menambahkan layanan di module.services.yml Anda

services:
  five_hundred.:
    class: Drupal\five_hundred\EventSubscriber\five_hundredEventSubscriber
    arguments: ['@request_stack']
    tags:
      - { name: event_subscriber }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.