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

时间:2010-06-16 11:11:12

标签: php http response

我正在用PHP编写一个身份验证脚本,作为一个API调用,需要返回200 only in the case that it approves the request, and 403 (Forbidden) or 500`。

我遇到的问题是php在错误情况下返回200,而输出错误为html。除非我自己显式返回HTTP 500或HTTP 200,否则如何确保php将返回HTTP 403代码?换句话说,我想将任何和所有警告或错误条件转换为500 s,没有例外,以便默认情况下拒绝验证请求,并且例外是使用200批准它代码。

我摆弄了set_error_handler()error_reporting(),但到目前为止还没有运气。例如,如果代码在发送HTTP响应代码之前输出了某些内容,PHP自然会报告您在输出任何内容后无法修改标头信息。但是,这被PHP报告为200响应代码,其中html解释了该问题。我甚至需要将这种东西变成500代码。

这在PHP中可行吗?或者我是否需要在更高级别执行此操作,例如以某种方式使用mod_rewrite?如果是这样的话,任何想法我怎么设置它?

7 个答案:

答案 0 :(得分:73)

只需将状态代码作为回复发送header()

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

请记住,在发送时,必须才能成为任何输出。这意味着没有echo次调用,也没有HTML或空格。

答案 1 :(得分:20)

我检查了the PHP docs for header(),它比我做的更简单 - 如果第二个参数为true,它将替换类似的标头。默认为true。因此,正确的行为是标头('HTTP/1.1 403 Forbidden');,然后执行身份验证逻辑,然后如果它进行身份验证,请执行标头('HTTP/1.1 200 OK')。它将取代403响应,并保证403是默认值。

答案 2 :(得分:14)

自PHP 5.4.0起,http_response_code()就有了一个特殊化函数,即:

<?php
  http_response_code(404);
?>

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

答案 3 :(得分:11)

在set_error_handler()的php页面上你可以找到smp在ncoastsoft dot com上发表的评论,发布于2008年9月8日10:28,它展示了如何捕获致命错误(你通常无法捕捉到自定义错误)错误处理程序。我根据您的需要更改了代码:

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

这个shold捕获了不存在的函数的致命错误。它返回500并停止执行其余的脚本。

答案 4 :(得分:5)

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

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

这个(以及其他标题)应该在任何输出之前发送,除非您启用了输出缓冲。

答案 5 :(得分:2)

好奇如果你曾经想过如何让PHP在Parse错误上返回500 ...我有同样的确切需要...... API发布到我们的应用程序并且只有在所有内容都正确处理时才需要200 ...

在Parse错误的情况下,PHP返回错误200并且我使用了这两个函数:

register_shutdown_function()来 的set_error_han dler()

当代码中出现“解析/语法”错误时,这些不会被点击...

所以这是一个低级PHP函数,必须在PHP.INI或某处设置......我正在使用PHP 5.3.10 ......

答案 6 :(得分:1)

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

(注意,如果显式刷新输出缓冲区,header()调用仍将失败)

下进行。