Back to Question Center
0

.htaccess Semalt arahan tidak menangkap 404 ralat yang dicetuskan oleh PHP http_response_code (404)

1 answers:

Apache 2. 4. 10 pada Windows - roopa b. Saya mempunyai aplikasi PHP Zend Framework 1 yang stabil. Saya hanya memutuskan untuk menambah RalatDocument arahan kepada . htaccess . Saya benar-benar bingung dengan tiga tingkah laku yang saya peroleh dengan 404, bergantung kepada bagaimana ia dicetuskan.

saya. fail htaccess mengandungi:

     ErrorDocument 404 "Halaman tidak dijumpai"
RedirectMatch 404 / upload / (. * /)? swasta /    

Jika saya hanya menaip url untuk halaman yang tidak wujud dalam bar alamat, saya mendapat halaman ralat yang dihasilkan oleh ErrorController Zend Framework .

Jika saya masukkan / upload / private / foo (yang sepadan dengan RedirectMatch ), maka saya mendapat output ErrorDocument .

Tetapi jika dalam kod PHP saya lakukan

     http_response_code (404);
keluar  
;

maka saya mendapat halaman ralat standard penyemak imbas. Inilah yang saya faham sepenuhnya. Sekiranya saya menggunakan tab Rangkaian dalam alat Pembangun Chrome, saya dapat melihat bahawa ketiga-tiga permintaan memberikan status 404. Saya rasa saya boleh membayangkan bahawa persediaan pengendalian ralat Zend Framework akan menjebak url tidak wujud, dan melakukan perkara itu, memintas ErrorDocument pemprosesan. Tetapi saya tidak faham bagaimana segera keluar dari kod PHP dengan status 404 akan melepasi ErrorDocument .

Apakah kod PHP yang boleh saya tulis untuk mencetuskan arahan ErrorDocument ?

EDIT:

Berdasarkan jawapan dari Tim Fountain, saya harus memberikan lebih banyak konteks: Sebagaimana dinyatakan di atas, halaman ZF ErrorController saya ditubuhkan untuk melihat cara saya mahu - Saya melihat halaman itu apabila saya memasukkan URL untuk halaman yang tidak wujud. Dalam keadaan ini, saya sebenarnya menjalankan kod dari WordPress mu-plugin (WP dipasang di bawah direktori public ZF . The . htaccess fail secara semulajadi tidak mengarahkan permintaan untuk fail sedia ada di bawah awam ke ZF. Permintaan untuk apa-apa di bawah awam / wp sebaliknya pergi ke awam / wp / indeks. php mu-plugin bootstraps ZF (tetapi tidak memanggil kaedah bootstrap run

) dan kemudian meneliti permintaan. Jika ia tidak dibenarkan (mengikut pembolehubah sesi Auth ZF), saya ingin memberikan 404 (bukan 403). Sebelum ini, saya melakukan ini dengan benar-benar mengarahkan ke URL tidak wujud, dan itu menunjukkan halaman ErrorController dengan baik - tetapi ia juga meninggalkan bar alamat yang memaparkan URL tidak wujud. Saya memutuskan untuk menambah arahan ErrorDocument supaya bar alamat akan tetap menunjukkan URL yang ditaip oleh pengguna. Dalam kod sebenar saya, saya tidak mempunyai rentetan mudah pada arahan, tetapi URL ini: / default / error / error? Error_handler [type] = 404 . Saya mengubahnya menjadi rentetan mudah untuk memastikan tidak ada sesuatu tentang URL yang menyebabkan masalah. Perhatikan bahawa apabila saya memasukkan URL untuk sesuatu dalam direktori swasta yang mencetuskan RedirectMatch , saya melihat halaman ZF ErrorController , jadi saya tahu URL sendiri tidak masalah. Saya hanya mahu mengurangkan kerumitan untuk posting ini.

Jawapan Tim menyatakan bahawa kod masalah saya menghantar halaman 404 kosong terus ke penyemak imbas, dan pelayar menukarnya ke teks penjelasan. Semalat dengan jelas apa yang berlaku!

Adakah ini bermakna bahawa masalah saya adalah bahawa saya perlu menghasilkan beberapa kandungan halaman tanpa sifar dan menggunakan header

untuk menetapkan status, kerana http_response_code
menghantar kosong kandungan terus ke penyemak imbas? Tetapi yang tidak jelas dalam jawapannya adalah mengapa RalatDokumen arahan akan dilangkau.

URL permintaan yang menyebabkan kelakuan ini adalah http: // www. contohnya. com / wp / foo . The DocumentRoot adalah / awam . Ini tidak ditulis semula oleh . htaccess untuk pergi ke ZF, tetapi pergi terus ke awam / wp / indeks. php . Dalam kes saya fikir bahawa ErrorDocument akan dicetuskan

EDIT 2:

Atau tunggu, mungkin titik Tim tidak benar-benar mengenai pengendalian Ralat ZF, tetapi dari sudut pandang Apache, permintaan masuk dipenuhi (dengan pergi ke awam / wp / indeks. php dan menjalankan PHP), jadi terpulang kepada kod PHP untuk mengendalikannya, saya tidak boleh kembali ke Apache's ErrorDocument selepas itu! Saya rasa saya mempunyai salah faham yang benar-benar asas bagaimana Kesilapan Dokumen berfungsi. Saya perlu memikirkan beberapa cara untuk menggunakan kod ErrorController secara langsung untuk memaparkan halaman yang saya mahu dengan status 404! Duh!

Saya rasa saya akan menerima jawapan Tim, walaupun jika dia ingin memperjelaskan / umumkan pendapatnya tentang kapan ErrorDocument pemprosesan dimainkan, itu bagus :-)

EDIT 3:

Hanya untuk membungkusnya. Saya menerima jawapan Tim kerana ia mendedahkan salah faham asas saya mengenai bagaimana kerja arahan Apache ErrorDocument . Tetapi ia tidak langsung menunjukkan kepada saya cara menyelesaikan masalah yang saya alami, dengan menemui bahawa saya ingin mengembalikan status 404 menggunakan halaman status adat saya Zend Framework, tetapi saya menjalankan pertanyaan WordPress setelah bootstrapped ZF tanpa memulakan Aplikasi MVC berjalan di bawah bootstrap. Saya tidak mempunyai pengalaman berkawan dengan pengawal hadapan ZFs, tetapi selepas menggali dokumen sedikit, saya datang dengan penyelesaian ini, yang mempunyai kesan yang sama seperti penuh RalatDocument arahan yang saya ingin perjalanan.

     $ error_url = $ this-> serverUrl  
. '/ default / error / error? error_handler [type] = 404'; $ request = new Zend_Controller_Request_Http ($ error_url); $ front = Zend_Controller_Front :: getInstance
; $ front-> returnResponse (true); $ respons = $ front-> dispatch ($ request); $ response-> setRawHeader ('HTTP / 1. 1 404 Tidak dijumpai '); $ response-> sendResponse
; keluar
;
February 8, 2018

Mungkin dalam peraturan htaccess anda, anda juga mempunyai peraturan menulis semula untuk menunaikan semua permintaan kepada Rangka Kerja Zend. Pada ketika ini, Apache (dan ErrorDocument) tidak benar-benar dalam gambar, seperti yang anda telah memberitahu bahawa anda mahu permintaan itu ditangani oleh PHP.

Apabila anda melakukan:

  http_response_code (404);
keluar 

;

anda menghantar halaman 404 kosong ke penyemak imbas. Ramai penyemak imbas adalah persediaan untuk menunjukkan halaman 404 mesra pengguna mereka sendiri jika saiz halaman 404 yang mereka terima daripada pelayan kurang daripada bait X. (Hanya untuk pengalaman pengguna yang lebih baik. )

Zend Framework harus menangkap ini dan menggunakan laman ralatnya sendiri bergantung kepada di mana anda meletakkan kod PHP (dan mungkin berdasarkan beberapa pilihan konfigurasi).

Saya cadangkan anda mengemaskini halaman Zend Framework ErrorController untuk melihat yang anda mahu. Saya tidak percaya ada cara untuk memroses permintaan balik ke Apache (kerana ia adalah).