我正在用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
?如果是这样的话,任何想法我怎么设置它?
答案 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)