Soru Ne olursa olsun, herhangi bir hatada HTTP 500 kodu nasıl iade edilir


200 olarak dönmesi gereken bir API olarak adlandırılmak üzere PHP'de bir kimlik doğrulama komut dosyası yazıyorumonly in the case that it approves the request, and403(Forbidden) orAksi takdirde 500`.

İçinde bulunduğum problem şu ki php geri döndü 200 Hata koşullarında, hatayı html olarak çıktılamak yerine. Php'nin bir HTTP döndüreceğinden nasıl emin olabilirim 500 HTTP'yi açıkça döndürmediğim sürece kod 200 veya HTTP 403 kendim? Diğer bir deyişle, tüm uyarı ve hata koşullarını açmak istiyorum. 500s, istisnalar yoktur, böylece varsayılan durum kimlik doğrulama isteğini reddeder ve istisna bununla birlikte 200 kodu.

Ben ile uğraştım set_error_handler() ve error_reporting()ama şimdiye kadar şans yok. Örneğin, kod, HTTP yanıt kodunu göndermeden önce bir şey çıkarırsa, PHP, herhangi bir şey çıktıktan sonra başlık bilgilerini değiştiremeyeceğinizi doğal olarak bildirir. Ancak, bu PHP tarafından bir 200 Sorunu açıklayan html ile yanıt kodu. Bu tür bir şeye bile ihtiyacım var. 500 kodu.

PHP'de bu mümkün mü? Veya bunu kullanarak daha yüksek bir seviyede yapmam gerekiyor mu? mod_rewrite bir şekilde? Eğer durum buysa, nasıl kurduğum hakkında bir fikrin var mı?


44
2018-06-16 11:11


Menşei


Bunun için bir hata raporu var: bugs.php.net/bug.php?id=50921 - Düzeltilebileceği gibi dikişler. - Thomas Ahle


Cevaplar:


Durum kodunu yanıt olarak göndermeniz yeterlidir. header():

header('HTTP/1.1 500 Internal Server Error');

Bunu orada gönderirken hatırlayın Yapmamalısın ondan önce herhangi bir çıktı olsun. Bu hayır demek echo aramalar ve HTML veya boşluk yok.


70
2018-06-16 11:12



Ayrıca, bunun CGI olarak veya IIS altında çalıştırılmayacağını unutmayın. - Ignacio Vazquez-Abrams
Teşekkürler - Yanıt kodunu nasıl göndereceğimi biliyorum ve bu soruya da değindiğim gibi daha önce çıktı göndermemeyi biliyorum. Sorum, PHP'nin hata durumunda html hatasıyla 200 yanıt kodu göndermesini nasıl engelleyeceğidir. - Jake
Gönderin ve sonra hata mesajını çıkar mı? Bir durum üstbilgisi göndermek, PHP'ye varsayılanı geçersiz kılmalarını söyler 200 OK cevap kodu. - BoltClock♦
BoltClock: İşlenmemiş istisnalar durumunda hangi başlığın gönderileceğini nasıl bilebilirdiniz? - Thomas Ahle
Harika bir çözüm, bugünün tüm çocuklarına rağmen http_response_code(500); başlığı ayarlamak için. - Ellesedil


kontrol ettim başlık için PHP docs ()ve bunu yaptığımdan daha basit - ikinci parametre doğruysa, benzer bir başlığın yerini alacak. varsayılan doğrudur. Yani doğru davranış başlıktır ('HTTP/1.1 403 Forbidden');Daha sonra kimlik doğrulama mantığını yapın, daha sonra kimlik doğrulaması yaparsa, üstbilgi yapın ('HTTP/1.1 200 OK'). 403 cevabının yerini alacak ve 403'ün varsayılan olduğunu garanti edecektir.


20
2017-08-25 22:25



Güzel iş, bu mükemmel bir çözüm. - tpow


Set_error_handler () için php sayfasında, 08-Sep-2003 10:28 'de yayınlanan ncoastsoft dot com'da smp ile ilgili bir yorum bulabilirsiniz, bu da ölümcül hataları nasıl yakalayacağınızı açıklar (normalde özel bir hata işleyicisiyle yakalanamazsınız). İhtiyacın olan kodu değiştirdim:

error_reporting(E_ALL);
ini_set('display_errors', 'on');

function fatal_error_handler($buffer) {
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

function handle_error ($errno, $errstr, $errfile, $errline){
    header('HTTP/1.1 500 Internal Server Error');
    exit(0);
}

ob_start("fatal_error_handler");
set_error_handler("handle_error");

//would normally cause a fatal error, but instead our output handler will be called allowing us to handle the error.
somefunction();
ob_end_flush();

Bu, mevcut olmayan fonksiyonun ölümcül hatasını yakalar. Bir 500 döndürür ve komut dosyasının geri kalanının yürütülmesini durdurur.


11
2018-06-16 19:32



Herhangi bir hatayı yakalar ama ayrıştırma hataları. - Ayrıca, hata izini gizleyecektir, böylece aynı işlevi elde etmek için display_errors özelliğini de devre dışı bırakabilirsiniz. - Thomas Ahle
@ThomasAhle, üstbilgileri ayarladıktan sonra kendiniz bir yığın izleme çıktı alabilirsiniz - chacham15


PHP 5.4.0'dan beri bunun için spezialize bir fonksiyon var. http_response_code() yani .:

<?php
  http_response_code(404);
?>

görmek http://www.php.net/manual/en/function.http-response-code.php


11
2017-11-27 07:13



Bunun için teşekkürler! PHP'nin artık bu tür bir şey için yardımcı bir işlevi olduğunu görmekten memnuniyet duyuyorum. - renoirb
Şıklık bilinse de, bu bir php hatası ile karşılaştığı zaman 200 OK döndürmesini engellemez. - Ellesedil
emin olun, bu hata için bir değişiklik değil handling, bu hata reporting - Martin M


header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');

Bir iç sunucu hatası olduğunu gösteren 500 kullanmamalısınız.

Bu (ve diğer başlıklar), çıktı tamponlama etkinleştirilmişse, herhangi bir çıkıştan önce gönderilmelidir.


5
2018-06-16 11:13



Teşekkürler, ama bu benim sorum değil. Yanıt kodunu nasıl göndereceğimi biliyorum. PHP'nin hata durumunda 200 kodunu göndermesini nasıl engellerim? - Jake
@Jake 403 cevabını gönderirseniz, 200 göndermez. Bir şey özlüyor muyum? - Artefacto
Sorun şu ki, bir 403 0r 200 gönderilip gönderilmeyeceğini bilmeden önce bir hata durumuna geçerse, hatayla birlikte bir 200 gönderir. Ters davranışı istiyorum - bir hata durumunda varsayılanı 403 veya 500 veya 200'den başka bir şey olmak istiyorum, böylece sadece 200 yanıt kodu gönderdim. Hemen 403 kodunu yazmayı ve sonra başarılı olursa, 200 ile üzerine yazmayı deneyeceğim. Davranışın bu durumda nasıl olması gerektiğini bilmiyorum. Kimse biliyor mu? 403'ün üzerine yazılacak mı? - Jake


Eğer PHP, Parse hataları 500 dönüş nasıl olsun anladım meraklı ... Aynı tam ihtiyacım var ... API bizim app gönderme ve her şey düzgün işlenmişse sadece 200 bekliyor ...

Ayrıştırma hatası durumunda, PHP bir Hata 200'ü döndürür ve bu işlevlerin ikisini de kullandım:

register_shutdown_function () set_error_handler ()

ve kodda bir "ayrıştırma / sözdizimi" hatası oluştuğunda bunlar yakalanmıyor ...

Yani bu PHP.INI veya başka bir yerde ayarlanması gereken düşük seviyeli bir PHP işlevi ... Ben PHP 5.3.10 kullanıyorum ...


2
2018-01-05 16:42





Sayfanın gövdesine yazdıktan sonra üstbilgileri değiştirmenize izin vermek için çıktı arabelleği kullanın. Bunu içinde ayarlayabilirsiniz ini dosyası her komut dosyasını güncellemek yerine.

(Çıkış arabelleğini açıkça temizlerseniz, başlık () çağrısı başarısız olur.)

C.


1
2018-06-16 16:28