Saya memiliki skrip PHP yang perlu membuat respons dengan kode respons HTTP (kode status), seperti HTTP 200 OK, atau kode 4XX atau 5XX.
Bagaimana saya bisa melakukan ini di PHP?
sumber
Saya memiliki skrip PHP yang perlu membuat respons dengan kode respons HTTP (kode status), seperti HTTP 200 OK, atau kode 4XX atau 5XX.
Bagaimana saya bisa melakukan ini di PHP?
Saya baru saja menemukan pertanyaan ini dan merasa perlu jawaban yang lebih komprehensif:
Pada PHP 5.4 ada tiga metode untuk mencapai ini:
The header()
fungsi memiliki penggunaan-kasus khusus yang mendeteksi garis respon HTTP dan memungkinkan Anda mengganti dengan satu kustom
header("HTTP/1.1 200 OK");
Namun, ini memerlukan perlakuan khusus untuk (Cepat) CGI PHP:
$sapi_type = php_sapi_name();
if (substr($sapi_type, 0, 3) == 'cgi')
header("Status: 404 Not Found");
else
header("HTTP/1.1 404 Not Found");
Catatan: Menurut HTTP RFC , frasa alasannya bisa berupa string khusus apa pun (yang sesuai dengan standar), tetapi demi kompatibilitas klien saya tidak merekomendasikan menempatkan string acak di sana.
Catatan: php_sapi_name()
membutuhkan PHP 4.0.1
Jelas ada beberapa masalah saat menggunakan varian pertama itu. Yang terbesar menurut saya adalah sebagian diuraikan oleh PHP atau server web dan kurang didokumentasikan.
Sejak 4.3, header
fungsi memiliki argumen ke-3 yang memungkinkan Anda mengatur kode respons dengan nyaman, tetapi menggunakannya membutuhkan argumen pertama menjadi string yang tidak kosong. Berikut ini dua opsi:
header(':', true, 404);
header('X-PHP-Response-Code: 404', true, 404);
Saya merekomendasikan yang kedua . Yang pertama tidak bekerja pada semua browser saya telah diuji, tetapi beberapa browser kecil atau web crawler mungkin memiliki masalah dengan garis header yang hanya berisi tanda titik dua. Nama bidang header di ke-2. Varian ini tentu saja tidak standar dengan cara apa pun dan dapat dimodifikasi, saya hanya memilih nama yang mudah-mudahan deskriptif.
The http_response_code()
Fungsi diperkenalkan di PHP 5.4, dan itu membuat hal-hal yang jauh lebih mudah.
http_response_code(404);
Itu saja.
Berikut adalah fungsi yang saya buat ketika saya membutuhkan kompatibilitas di bawah 5.4 tetapi menginginkan fungsi dari fungsi "baru" http_response_code
. Saya percaya PHP 4.3 lebih dari cukup kompatibilitas ke belakang, tetapi Anda tidak pernah tahu ...
// For 4.3.0 <= PHP <= 5.4.0
if (!function_exists('http_response_code'))
{
function http_response_code($newcode = NULL)
{
static $code = 200;
if($newcode !== NULL)
{
header('X-PHP-Response-Code: '.$newcode, true, $newcode);
if(!headers_sent())
$code = $newcode;
}
return $code;
}
}
header('X-PHP-Response-Code: 404', true, 404);
itu berfungsi dengan baik di bawah PHP-FPM (FastCGI)headers_sent()
selalu benar setelah meneleponheader()
? (2) pernah menemukan sesuatu seperti http_response_text () di dunia 5.4? Setidaknya tajuk lama () dapat memengaruhi teks setelah kode status.headers_sent()
benar jika Anda tidak dapat menambahkan header lagi karena konten sudah dikirim, bukan jika Anda telah menambahkan header. (2) Maaf, tidak. Bahasa lain memiliki dukungan yang lebih baikhttp_response_code
(dan mungkin lebih umum memodifikasi header) tidak berfungsi lagi setelah Andaecho
sesuatu. Semoga ini bisa membantu.Sayangnya saya menemukan solusi yang disajikan oleh @dualed memiliki berbagai kekurangan.
Menggunakan
substr($sapi_type, 0, 3) == 'cgi'
bukan enogh untuk mendeteksi CGI cepat. Saat menggunakan PHP-FPM FastCGI Process Manager,php_sapi_name()
mengembalikan fpm bukan cgiFasctcgi dan php-fpm mengekspos bug lain yang disebutkan oleh @Josh - menggunakan
header('X-PHP-Response-Code: 404', true, 404);
tidak berfungsi dengan baik di bawah PHP-FPM (FastCGI)header("HTTP/1.1 404 Not Found");
mungkin gagal ketika protokol bukan HTTP / 1.1 (yaitu 'HTTP / 1.0'). Protokol saat ini harus dideteksi menggunakan$_SERVER['SERVER_PROTOCOL']
(tersedia sejak PHP 4.1.0Setidaknya ada 2 kasus saat panggilan
http_response_code()
menghasilkan perilaku yang tidak terduga:Untuk referensi Anda di sini ada daftar lengkap kode status respons HTTP (daftar ini mencakup kode dari standar internet IETF serta RET IETF lainnya. Banyak di antaranya TIDAK saat ini didukung oleh fungsi PHP http_response_code): http: //en.wikipedia .org / wiki / List_of_HTTP_status_codes
Anda dapat dengan mudah menguji bug ini dengan menelepon:
Server akan mengirim "500 Internal Server Error" kode respons HTTP yang menghasilkan kesalahan tak terduga jika misalnya Anda memiliki aplikasi klien kustom yang memanggil server Anda dan mengharapkan beberapa kode HTTP tambahan.
Solusi saya (untuk semua versi PHP sejak 4.1.0):
Kesimpulan
Implementasi http_response_code () tidak mendukung semua kode respons HTTP dan dapat menimpa kode respons HTTP yang ditentukan dengan kode lain dari grup yang sama.
Fungsi http_response_code () baru tidak menyelesaikan semua masalah yang ada tetapi membuat hal-hal terburuk memperkenalkan bug baru.
Solusi "kompatibilitas" yang ditawarkan oleh @dualed tidak berfungsi seperti yang diharapkan, setidaknya di bawah PHP-FPM.
Solusi lain yang ditawarkan oleh @dualed juga memiliki berbagai bug. Deteksi CGI cepat tidak menangani PHP-FPM. Protokol saat ini harus dideteksi.
Setiap tes dan komentar sangat dihargai.
sumber
karena PHP 5.4 dapat Anda gunakan
http_response_code()
untuk mendapatkan dan mengatur kode status tajuk.berikut sebuah contoh:
di sini adalah dokumen dari fungsi ini di php.net:
http_response_code
sumber
Tambahkan baris ini sebelum output tubuh apa pun, jika Anda tidak menggunakan buffering output.
Ganti bagian pesan ('OK') dengan pesan yang sesuai, dan kode status dengan kode Anda yang sesuai (404, 501, dll)
sumber
Jika Anda di sini karena Wordpress memberikan 404 saat memuat lingkungan, ini akan memperbaiki masalah:
Masalahnya adalah karena ia mengirim Status: 404 Tidak Ditemukan header. Anda harus menimpanya. Ini juga akan berfungsi:
sumber
Dengan fungsi header . Ada contoh di bagian parameter pertama yang diperlukan.
sumber
http_response_code (200); tidak berfungsi karena peringatan uji 404 https://developers.google.com/speed/pagespeed/insights/
sumber
Jika versi PHP Anda tidak termasuk fungsi ini:
sumber
Kita bisa mendapatkan nilai balik yang berbeda dari http_response_code melalui dua lingkungan yang berbeda:
Di lingkungan server web, kembalikan kode respons sebelumnya jika Anda memberikan kode respons atau ketika Anda tidak memberikan kode respons apa pun maka itu akan mencetak nilai saat ini. Nilai standarnya adalah 200 (OK).
Di CLI Environment, true akan kembali jika Anda memberikan kode respons dan false jika Anda tidak memberikan response_code.
Contoh Lingkungan Web Server dari nilai pengembalian Response_code:
Contoh nilai pengembalian Lingkungan CLI dari Response_code:
sumber