我正试图从api请求中提取到向register_rest_route
注册的端点的Authorization标头,但它不存在。
我注册了一条路线:
register_rest_route('my_plugin', '/users', array(
'methods' => 'PUT',
'callback' => array($this, 'update_user'),
)
);
简单的哑回调:
public function update_user($request)
{
$all_headers = $request->get_headers();
return new WP_REST_Response($all_headers, 200);
}
然后我向确保设置Authorization标头的端点发出请求。
但响应中缺少标头:
{
"host": ["localhost:8080"],
"connection": ["keep-alive"],
"content_length": ["23"],
"accept": ["application/json, text/plain, */*"],
"origin": ["http://localhost:8080"],
"user_agent": [],
"content_type": ["application/json;charset=UTF-8"],
"referer": [
"http://localhost:8080"
],
"accept_encoding": ["gzip, deflate, br"],
"accept_language": ["en-US,en;q=0.9"],
"cookie": []
}
?
答案 0 :(得分:2)
$ request-> get_headers()将没有HTTP授权标头,因为$ request-> set_headers()如下完成:
$request->set_headers( $this->get_headers( wp_unslash( $_SERVER ) ) );
其中$ this是WP_REST_Server的实例。但是WP_REST_Server的get_headers()在class-wp-rest-server.php中定义如下:
/**
* Extracts headers from a PHP-style $_SERVER array.
*
* @since 4.4.0
*
* @param array $server Associative array similar to `$_SERVER`.
* @return array Headers extracted from the input.
*/
public function get_headers( $server ) {
$headers = array();
// CONTENT_* headers are not prefixed with HTTP_.
$additional = array( 'CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true );
foreach ( $server as $key => $value ) {
if ( strpos( $key, 'HTTP_' ) === 0 ) {
$headers[ substr( $key, 5 ) ] = $value;
} elseif ( isset( $additional[ $key ] ) ) {
$headers[ $key ] = $value;
}
}
return $headers;
}
因此,仅提取前缀为“ _HTTP”的全局$ _SERVER的成员以及成员“ CONTENT_LENGTH”,“ CONTENT_MD5”和“ CONTENT_TYPE”。但是授权成员是$ _SERVER全局变量中的'PHP_AUTH_USER','PHP_AUTH_PW'和'PHP_AUTH_DIGEST'。
答案 1 :(得分:0)
我的主要猜测是WP_Rest稍后将其剥离。 您可以通过以下方式查看未过滤的结果:
public function update_user($request)
{
echo json_encode($request->get_headers())
exit;
}
如果这样做没有帮助。
发送随机标头,会出现吗?如果标题以x-
答案 2 :(得分:0)
确保您的服务器实际上启用了HTTP授权标头;在Apache网站配置或.htaccess中:
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
这应该返回标题:
$request->get_header('authorization')