我的wordpress站点位于Akamai之后,Akamai是一种类似于Cloudflare的缓存服务。
我进行以下API调用:
GET /wp-json/mytheme/v1/get-posts?post_type=videos
这是使用来自“@wordpress/api fetch”的apiFetch完成的;
它会自动将其包含在请求标头中
X-WP-Nonce: 12323423
这可以正常工作,直到24小时后,nonce过期。缓存仍然继续使用过期的Nonce,导致403被禁止和页面被破坏。
如果我在没有Nonce头的情况下发出相同的请求,那么它就可以正常工作。
Wordpress中有没有办法禁用或删除仅用于GET请求的Nonce?
或者甚至通过拦截请求来删除X-WP-Nonce头?
这是我从wordpress前端发出请求的代码。
apiFetch({
path: \'/wp-json/mytheme/v1/get-posts?post_type=videos\',
parse: false,
});
最合适的回答,由SO网友:thomas_jones 整理而成
基于身份验证文档here - 每个请求都需要传递一个nonce密钥。
因此,如果在前端缓存的nonce密钥超过了其使用寿命,则需要在身份验证步骤之前钩住API请求,并用有效的nonce密钥替换缓存的nonce密钥。
WordPress提供rest_send_nocache_headers
供我们连接的过滤器(See here). 这允许我们在身份验证之前执行操作。
$send_no_cache_headers = apply_filters(\'rest_send_nocache_headers\', is_user_logged_in());
if (!$send_no_cache_headers && !is_admin() && $_SERVER[\'REQUEST_METHOD\'] == \'GET\') {
$nonce = wp_create_nonce(\'wp_rest\');
$_SERVER[\'HTTP_X_WP_NONCE\'] = $nonce;
}
在上面的示例中,我们通过
is_user_logged_in()
函数作为参数。这将返回true或false。
然后在我们的查询中,如果用户未登录,则他们不在管理员中,这是GET
请求我们继续用有效的nonce密钥切换无效的nonce密钥。
SO网友:Andy Keith
为了补充已被接受的答案,我找到了一个类似的解决方案,但却与rest_authentication_errors
之前rest_cookie_check_errors
跑步
由于根本问题是nonce expiration,因此当用户登录时(即没有发送缓存头时)以及注销时,可能会出现此问题。我还进行了一些检查,以确保我们只处理REST请求——我检查了“REST\\U路由”查询变量,但可能有更好的方法来实现这一点。
add_filter( \'rest_authentication_errors\', function( $errors ) {
// Bail if rest_route isn\'t defined (shouldn\'t happen!)
if ( empty( $GLOBALS[\'wp\']->query_vars[\'rest_route\'] ) ) {
return $errors;
}
$route = ltrim( $GLOBALS[\'wp\']->query_vars[\'rest_route\'], \'/\' );
// Ensure we\'re dealing with our REST requst.
if ( 0 !== strpos( $route, \'my-awesome-namespace/v1\' ) ) {
return $errors;
}
if ( ! empty( $_SERVER[\'HTTP_X_WP_NONCE\'] ) ) {
$nonce = $_SERVER[\'HTTP_X_WP_NONCE\'];
if ( ! wp_verify_nonce( $nonce, \'wp_rest\' ) ) {
// Nonce check failed, so create a new one.
$_SERVER[\'HTTP_X_WP_NONCE\'] = wp_create_nonce( \'wp_rest\' );
}
}
return $errors;
}, 10 );