6把刀
- 6把刀 回答了问题 api怎么设置options
'' => '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' => 'options3.最终改为'《action》' => 'options'
说有问题是因为你统一了路由,这种写法,在与我们写路由来说,是不规范的,路由就是有什么写什么,最小化标准,会让你更快的定位问题。比如 www.xxx.com/users/12 这样你的options就又走不通了。是不是得'/' => 'options'了呢,不能说你写错,只能说你思想不对。就得'OPTIONS users/' => 'options'一定要去看YII2他的路由创建原理是怎么实现的,看源代码
而你以上的理解错误是因为
你写在patterns里,他的意思是替换原有路由
patterns 或 extraPatterns 重新定义现有的模式或添加此规则支持的新模式 - 6把刀 回复了 RichardTian 的回答
http://www.yiichina.com/doc/api/2.0/yii-filters-cors
看看这里介绍,希望能帮到你他的问题并不是CORS的问题,而是浏览器发起XHR时会先发起一个options请求。这是浏览器发起的。而YII的路由没有设置这种请求options v1/user/abc所以会出现404错误。
而楼主所做的做法也是不对的。并没有明白起原理。只是解决他现在出的问题,而不知道他这种写法是错误的。 - 6把刀 回答了问题 新手求Yii接入微信登录的实现思路
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
先理解上文。我再简说。能听懂几分看造化了。
用户访问www.xxx.com 系统先去判定是否有已经登陆过。可以是session等。
如果没有登陆就发起微信网页授权。授权成功后,微信会访问你指定的一个连接比如www.xxx.com/login?access=kdkdkdkdkdk
而这login就是处理登陆的东西。而拿到这个access后,所要做的东西,比如拿到openid等,那就看
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 打印head头里面有木有数据
@shuzhiqian 建一个BaseCongtroller.php这个为基类,在这个基类的behaviors里去处理这个循序与过滤器,不要在main里面去配置。基它类都继承这个基类就OK
你这个问题有个很好的解决方法就是上传图片是一个单独的控制器,比如点击上传图片后,他会给这个input付上一个图片地址的url,而不是一个fileinput,判定字符处理更好,之后那个单独的上传方法里面去上做上传逻辑,这样可以集中管理上传操作,这对与比如阿里云的OSS还是更换一些上传的云都很方便 这里你可以看看github https://github.com/bailangzhan/yii2-webuploader 这里说的是缩略图,还有一个就是编辑内容的图片上传,比如单上传还是多图上传,原理一样。
另一个方案就是你定义rule是不为空。
第一次添加不为空会提示,关健再update时,他会给这个image付上空字符串
这里处理也是多种方式,比如你可以直接在控制器里给保存前给一个$oldimage付一个值,之后再判定有没有上传文件,没有就把这个老的图片保留重新付给 $model->image这是在控制器里操作的,你还可以把他简化到 Model里,复写save()方法,判定getIsNewRecord是就是插入,否就是更新,再把处理图片的逻辑写在这。
代码就不写了,主要写逻辑思路。
RESTful API是大家遵循的规则,这样开发者,与使用开发者可以省很多事。
大家都讲本地方言,很多人听不懂,来个世界语言多好,但是没有规定一定要干嘛。如果你是APACHE服务器的话可以尝试在conf文件见里面配置header 试一下
Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS,DELETE" Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Allow-Headers "Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With"
然后在我API认证的时候去除了对OPTIONS的请求的验证
if (Yii::$app->getRequest()->getMethod() !== 'OPTIONS') { .... }
你可以尝试这样配置下。另外就是我还做了一下将OPTIONS的请求都返回了200,让前端省去判断这个请求的返回结果。
是在.htacess里面写的rewrite:RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
如果有需要你可以试试
因为Yii2+vue2 他回碰到常规问题就是cors 与 auth AUTH与cors有先后问题。还有看options你直接查看auth下的optionAction,CORS知识面有点广。不是一两句可以说清,你追踪YII的处理方式
如果你是APACHE服务器的话可以尝试在conf文件见里面配置header 试一下
Header always set Access-Control-Allow-Origin "*" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS,DELETE" Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Allow-Headers "Authorization,DNT,User-Agent,Keep-Alive,Content-Type,accept,origin,X-Requested-With"
然后在我API认证的时候去除了对OPTIONS的请求的验证
if (Yii::$app->getRequest()->getMethod() !== 'OPTIONS') { .... }
你可以尝试这样配置下。另外就是我还做了一下将OPTIONS的请求都返回了200,让前端省去判断这个请求的返回结果。
是在.htacess里面写的rewrite:RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
如果有需要你可以试试
手机竟然没发在下面富文本出发回复。醉了。我今天就有像解决所有未解决问题的冲动。楼主我介意从XHR 跨域 options cors,还有在控制器里打印所有behaviors 并查看执行顺序。比如过CORS前是否有AUTH授权验证。