如何在任何错误上返回HTTP 500代码,无论如何

我正在用PHP编写一个authentication脚本,被称为API,只有在批准请求的情况下才需要返回200,否则就是403(Forbidden)或500。

我遇到的问题是,在错误情况下,PHP返回200,而不是输出错误。 我怎样才能绝对确信PHP将返回一个HTTP 500代码,除非我自己显式地返回HTTP 200或HTTP 403? 换句话说,我想把任何和所有的警告或错误条件都变成500秒,没有例外,所以默认的情况是拒绝authentication请求,例外是用200代码来批准。

我已经摆弄了set_error_handler()和error_reporting(),但到目前为止没有运气。 例如,如果代码在发送HTTP响应代码之前输出了某些内容,那么PHP自然会报告在输出任何东西之后不能修改标题信息。 但是,这是由PHP报告的200响应代码与解释问题的HTML。 我甚至需要把这种东西变成500码。

这是可能的PHP? 或者我需要在更高级别上使用mod_rewrite吗? 如果是这样,任何想法如何设置?

只需发送状态代码作为响应header()

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

请记住,发送时, 不能有任何输出。 这意味着没有echo调用,没有HTML或空白。

我检查了PHP文档的header() ,它比我更简单 – 如果第二个参数是true,它将会replace一个类似的头文件。 默认是true。 所以正确的行为是头('HTTP/1.1 403 Forbidden'); ,然后执行身份validation逻辑,然后如果进行身份validation,请执行标头('HTTP/1.1 200 OK') 。 它将取代403响应,并将保证403是默认的。

在set_error_handler()的php页面上,你可以find一个由smp发布于2003年9月8日10点28分,这暴露了如何甚至可以捕获致命错误(你通常不能捕捉到自定义的error handling程序。我改变了你的需要的代码:

 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(); 

这个翻阅赶上了现有function的致命错误。 它比返回500并停止执行脚本的其余部分。

从PHP 5.4.0开始,对于那个http_response_code()有一个特殊的函数,比如:

 <?php http_response_code(404); ?> 

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

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

您不应该使用500,表示内部服务器错误。

这个(和其他标题)应该在任何输出之前被发送,除非你有输出缓冲被启用。

使用输出缓冲来允许您在写入页面正文后修改标题。 你可以在ini文件中设置它,而不是更新每个脚本。

(注意,如果你明确的刷新输出缓冲区,header()调用仍然会失败)

C。

好奇,如果你曾经想过如何得到PHP的parsing错误返回500 …我有同样的确切需要… API张贴到我们的应用程序,并期望只有一切都被正确处理200 …

在出现Parse错误的情况下,PHP返回一个错误200,我已经使用了这两个函数:

register_shutdown_function()set_error_handler()

当代码中出现“parse / syntax”错误时,这些命令不会被触发。

所以这是一个低级别的PHP函数,必须在PHP.INI或其他地方设置…我正在使用PHP 5.3.10 …