Yii2 REST自定义接口OPTIONS预检请求批量配置失效求助
解决Yii2 REST API批量配置OPTIONS预检请求失效的问题
我之前也碰到过一模一样的问题,你说的批量配置规则没效果,大概率是正则表达式的匹配范围不够导致的,咱们一步步来捋清楚:
问题根源:正则匹配不到带连字符的动作
你之前用的<action:\w+>或者{action}对应的正则\w+,只能匹配字母、数字和下划线,但你的自定义动作比如all-resellers包含连字符-,这不在\w的匹配范围内,所以OPTIONS请求根本匹配不到对应的路由规则,自然就失败了。
解决方案1:修正正则表达式,覆盖带连字符的动作
把批量OPTIONS规则里的正则改成<action:[-\w]+>,这样就能匹配包含连字符的动作了。修改后的完整配置如下:
[ 'class' => 'yii\rest\UrlRule', 'controller' => ['v1/call-rates'], 'pluralize' => false, 'extraPatterns' => [ 'OPTIONS <action:[-\w]+>' => 'options', // 修正后的正则,支持带连字符的动作 'GET all-resellers' => 'all-resellers', 'POST updatefromcsv' => 'updatefromcsv', // 其他自定义端点... ] ]
解决方案2:全局CORS处理(更省心的方式)
如果你的API有很多控制器和自定义动作,手动配置UrlRule还是挺麻烦的,你可以直接在控制器里添加CORS行为,自动处理所有OPTIONS预检请求:
在你的v1/call-rates控制器里添加如下代码:
use yii\filters\Cors; public function behaviors() { $behaviors = parent::behaviors(); // 添加上CORS过滤行为 $behaviors['corsFilter'] = [ 'class' => Cors::class, 'cors' => [ 'Origin' => ['*'], // 可以根据实际需求设置允许的具体域名 'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], 'Access-Control-Request-Headers' => ['*'], ], ]; return $behaviors; }
这种方式不需要在UrlRule里配置任何OPTIONS规则,Yii会自动处理所有预检请求,更适合多接口的场景。
验证配置是否生效
修改完配置后,你可以用curl测试OPTIONS请求:
curl -X OPTIONS http://你的API域名/v1/call-rates/all-resellers -i
如果响应头里包含Access-Control-Allow-Origin等CORS相关头信息,就说明配置已经生效了。
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

