WordPress API公共端点匿名访问返回401错误如何解决
WordPress自定义REST API匿名访问401解决方法
你已经给路由设置__return_true作为权限回调仍出现匿名访问401、登录后可正常访问的问题,按以下优先级排查修复:
- 排查全局REST鉴权拦截
这是90%同类问题的诱因:各类安全加固插件、主题或自定义代码会挂载rest_authentication_errors过滤器,全局拦截所有未登录的REST API请求,这个拦截的优先级高于单路由的权限回调,会直接返回401。
先加如下测试代码验证是否为该问题:
加完后用Postman发起匿名请求,如果能正常返回,就定位具体是哪个插件/代码加的全局拦截,针对你的公开路由单独放行即可,不要全局放开所有REST接口权限,避免安全风险。add_filter( 'rest_authentication_errors', function( $result ) { // 替换为你自己的接口路径特征,比如你的路由是/wp-json/myapi/v1/test,就写/myapi/v1/test if ( str_contains( $_SERVER['REQUEST_URI'], '/wp-json/替换成你的路由前缀' ) ) { return true; } return $result; }, 999 ); - 检查路由注册代码结构
很多人写register_rest_route时参数位置错误,把permission_callback写到了参数配置的args数组内部,导致配置不生效,参考正确写法:// 正确写法示例 register_rest_route( '自定义命名空间/v1', '/公开路由路径', [ 'methods' => 'GET', // 接口支持的请求方法 'callback' => '接口处理回调函数名', 'permission_callback' => '__return_true', // 注意:必须和methods、callback同级,不能写到args里 'args' => [ // 这里写接口参数的校验规则 ] ]); - 排查回调函数内部权限逻辑
如果路由权限配置正确,检查回调函数内部是否自带权限判断,比如调用了current_user_can()做权限校验、或者使用了wp_update_post()这类默认要求登录权限的函数,这类逻辑在匿名访问时也会抛出401错误。可以临时在回调函数开头加return "test success";测试,排除回调内部代码的问题。 - 刷新路由缓存
修改完路由代码后,进入WordPress后台「设置-固定链接」页面,不需要修改任何配置,直接点击底部的「保存更改」,即可自动刷新重写规则和REST路由缓存,避免旧配置缓存导致不生效。 - 排查服务器层面拦截
如果以上步骤都无效,检查服务器的WAF规则、Web服务器(Nginx/Apache)的访问控制配置,部分服务器面板的防扫描规则会默认拦截匿名访问wp-json路径的请求,针对你的公开接口路径放行即可。
注意:公开接口务必做好参数校验、频率限制,避免被恶意调用拖垮服务器,不要为了方便直接关闭整个REST API的鉴权。
内容的提问来源于stack exchange,提问作者Aaron Magnaye
相关产品推荐
相关产品推荐

