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

Jak*_*ke 45 php http response

我正在用PHP编写一个身份验证脚本,作为API调用,否则需要返回200 only in the case that it approves the request, and403 (Forbidden) or500`.

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

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

这可能在PHP?或者我是否需要在mod_rewrite某种程度上以更高的级别执行此操作?如果是这样的话,任何想法我怎么设置它?

Bol*_*ock 77

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

header('HTTP/1.1 500 Internal Server Error');
Run Code Online (Sandbox Code Playgroud)

请记住,发送它时,它之前一定不能有任何输出.这意味着没有echo调用,也没有HTML或空格.

  • 还要记住,如果以CGI或IIS运行,这将不起作用. (5认同)
  • 谢谢 - 我知道如何发送响应代码,并且我知道不要在响应代码之前发送输出,正如我在问题中提到的那样。我的问题是如何防止 PHP 在出现错误时发送 200 响应代码,错误为 html。 (2认同)
  • 很好的解决方案,虽然现在所有的孩子都使用`http_response_code(500);`设置标题. (2认同)

Jak*_*ke 20

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


Mar*_*n M 16

因为PHP 5.4.0有一个特殊化的函数,__CODE__即:

<?php http_response_code( 500 ); ?>
Run Code Online (Sandbox Code Playgroud)

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


2nd*_*boy 12

在set_error_handler()的php页面上你可以找到smp在ncoastsoft dot com上发表的评论,发布于2003年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();
Run Code Online (Sandbox Code Playgroud)

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


Art*_*cto 5

header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
Run Code Online (Sandbox Code Playgroud)

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

应该在任何输出之前发送此(和其他标头),除非您启用了输出缓冲.