Kode sederhana dan sederhana ini gagal mengembalikan kode respons HTTP 500 jika ada baris kosong di akhir file PHP yang diperlukan di titik akhir AJAX POST, yang disebut cursed.php. Dengan baris kosong saya selalu mendapatkan kode status 200. Ketika saya menghapus baris kosong saya mendapatkan kode status 500, seperti yang diharapkan.

Berikut adalah kode terkecil yang mereproduksinya untuk saya:

index.php

<script>
    const xhr = new XMLHttpRequest();
    xhr.open("POST", 'ajax.php', true);
    xhr.onreadystatechange = function() {
        console.log(this.status);
    }
    xhr.send();
</script>

ajax.php

<?
require_once('./cursed.php');
http_response_code(500);
die("foo");
?>

Dan file terkutuk ini: cursed.php

<?
?>

Lihat baris kosong di akhir cursed.php? Jika saya biarkan, panggilan balik selalu mengembalikan 200 OK. Jika saya menghapusnya, itu gagal dan mencetak status 500. Saya telah mencari di Google tentang ini dan tidak menemukan apa pun kecuali diskusi tentang mengapa Anda harus atau tidak boleh memiliki baris kosong di akhir file.

Saya menjalankan PHP7.2 di Ubuntu 18.x.

-1
PeterT 20 November 2020, 04:08

1 menjawab

Jawaban Terbaik

Mari kita lihat efek dari pernyataan require Anda. Ketika PHP menemukan pernyataan include atau require, itu akan menghentikan blok PHP saat ini dengan ?> implisit. Kemudian itu memulai file yang disertakan, menyematkan apa yang ditemukannya. Kemudian memulai blok PHP baru dengan <?php implisit (atau <?).

Dengan garis tambahan setelah ?> penutup di file yang Anda sertakan, ini memberikan hasil ini:

<?
?>
<?                                 // require statement here               
?>

<?
http_response_code(500);
die("foo");
?>

Perhatikan baris kosong di tengah? Itu diperlakukan sebagai output untuk dikirim ke klien. Karena muncul sebelum http_response_code(500); Anda, header sudah terkirim dan PHP tidak dapat mengubah kode status. Ergo, respons Anda adalah status 200 dengan konten baris kosong.

Abaikan ?> di akhir file kode PHP Anda. Jika PHP tidak menemukan pembatas penutup, itu akan mengasumsikan ?> implisit setelah baris terakhir, sehingga menghilangkan masalah.

Dari Manual PHP

Jika file hanya berisi kode PHP, lebih baik untuk menghilangkan tag penutup PHP di akhir file. Ini mencegah spasi putih yang tidak disengaja atau baris baru ditambahkan setelah tag penutup PHP, yang dapat menyebabkan efek yang tidak diinginkan karena PHP akan memulai buffering output ketika tidak ada niat dari programmer untuk mengirim output apa pun pada saat itu dalam skrip.

1
20 November 2020, 01:50