2018-04-03 11:14:16 3979次浏览 3条回答 0 悬赏 100 金钱

前端使用Axios发送get或者post请求的时候,如果带上header的话,总是会先发出一个options请求,后端没有配置options,这样就报错了,应该怎么配置?

'patterns' => [
    '' => 'options'  // 这样似乎没效果
]
补充于 2018-04-03 13:43

已解决

'' => 'options'不生效是因为设置了'controller' => 'v1/user',这样,如果使用OPTIONS访问 v1/users/abc的时候。会报404,看来这是只针对当前users的url,并不支持users下边的比如users/abc这种路径的访问。
最终改为'<action>' => 'options'

需要限制options可访问路由,就适当更改'<action>'规则

main.php路由配置

controller配置授权

最佳答案

  • 6把刀 发布于 2018-04-04 09:00 举报

    '' => 'options'不生效是因为设置了'controller' => 'v1/user',这样,如果使用OPTIONS访问 v1/users/abc的时候。会报404,看来这是只针对当前users的url,并不支持users下边的比如users/abc这种路径的访问。
    最终改为'' => 'options'
    就你理解的我一一给你理下。看看你能理解多少
    1.
    '' => 'options'不生效是因为设置了'controller' => 'v1/user'这是错误的理解
    '' => 'options' 的意思是当前设置的controller空路由时他的options访问可以到哪个位置,相当于
    options www.xxx.com/users 他options走的是actions里面的options独立方法

    2.
    如果使用OPTIONS访问 v1/users/abc的时候。会报404,
    这是因为options 访问 www.xxx.com/user/abc 你是没有配置过任何options的,你可以在你的chrome的请求头部看到信息
    你只要给他配置起来就行比如:我这里加点料,我怕你理解错,我加点。这个/user/abc他需要post请求那写法如下
    'POST abc' => 'abc',
    'OPTIONS abc' => 'options

    3.最终改为'《action》' => 'options'
    说有问题是因为你统一了路由,这种写法,在与我们写路由来说,是不规范的,路由就是有什么写什么,最小化标准,会让你更快的定位问题。比如 www.xxx.com/users/12 这样你的options就又走不通了。是不是得'/' => 'options'了呢,不能说你写错,只能说你思想不对。就得'OPTIONS users/' => 'options'

    一定要去看YII2他的路由创建原理是怎么实现的,看源代码

    而你以上的理解错误是因为
    你写在patterns里,他的意思是替换原有路由
    patterns 或 extraPatterns 重新定义现有的模式或添加此规则支持的新模式

    4 条回复
    回复于 2018-04-04 09:03 回复

    是不是得'/' => 'options'了呢 给系统过滤了,这里原意思是:是不是得

    '<action>/<id>' => 'options' 
    
    回复于 2018-04-04 11:12 回复

    是的,我把''=>'options'理解错了。一开写的时候最先想到的也是直接给abc配一个'OPTIONS abc' => 'options,但后来觉得如果有新的路由比如users/def ,users/ xyz 都需要options请求的时候,那就是又配两个?所以就想能不能写一个路由,同时满足这三个options请求,于是才有了我以为的''=>options可以生效的错误理解,接下来改成'<action>' => 'options'其实也有问题,当options请求一个不存在的路由的时候,他也会有返回。所以这种统一路由的想法就是不规范不建议的对吧

    回复于 2018-04-04 14:20 回复

    恩,所以开始我就说了,看起来能解决你的问题,其实是不对的。而这种不对,取决于你对这路由的理解偏差掉了

    回复于 2018-04-05 10:34 回复

    感谢

  • 回答于 2018-04-03 11:45 举报

    http://www.yiichina.com/doc/api/2.0/yii-filters-cors
    看看这里介绍,希望能帮到你

    3 条回复
    回复于 2018-04-03 15:06 回复

    他的问题并不是CORS的问题,而是浏览器发起XHR时会先发起一个options请求。这是浏览器发起的。而YII的路由没有设置这种请求options v1/user/abc所以会出现404错误。
    而楼主所做的做法也是不对的。并没有明白起原理。只是解决他现在出的问题,而不知道他这种写法是错误的。

    回复于 2018-04-03 17:52 回复

    这个确实是能解决当前的困扰,那正确的做法应该是什么?

    回复于 2018-04-04 11:46 回复

    Cool

  • 回答于 2018-08-30 17:30 举报

    楼主的 基类 behaviors方法里 是怎么配置的?

    认证 是每个控制器 都要配置一个behaviors方法吗?

    1 条回复
    回复于 2018-09-02 22:30 回复

    可以在 BaseController 中写上 behaviors,然后其他的继承他

    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
xczizz
副总裁

xczizz 比尔吉沃特

注册时间:2016-03-08
最后登录:2020-11-09
在线时长:97小时50分
  • 粉丝6
  • 金钱4967
  • 威望90
  • 积分6837

热门问题