我正在用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或空格.
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,表示内部服务器错误.
应该在任何输出之前发送此(和其他标头),除非您启用了输出缓冲.
| 归档时间: |
|
| 查看次数: |
77244 次 |
| 最近记录: |