我正在用PHP编写一个身份验证脚本,作为API调用,否则需要返回200 only in the case that it approves the request, and
403 (Forbidden) or
500`.
我200
遇到的问题是php 在错误情况下返回,输出错误为html.500
除非我自己显式返回HTTP 200
或HTTP,否则如何确保php将返回HTTP 代码403
?换句话说,我想将任何和所有警告或错误条件转换为500
s,没有例外,以便默认情况下拒绝验证请求,并且异常是使用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或空格.
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并停止执行其余的脚本.
header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
Run Code Online (Sandbox Code Playgroud)
您不应该使用500,表示内部服务器错误.
应该在任何输出之前发送此(和其他标头),除非您启用了输出缓冲.