1

1.一般的跨域get和post,通过设置nginx就可以解决。在nginx.conf的http中加入以下代码即可

add_header Access-Control-Allow-Origin *;

add_header Access-Control-Allow-Headers X-Requested-With,Content-Type,x_requested_with;

add_header Access-Control-Allow-Methods HEAD,GET,POST,OPTIONS;

2.在上面的nginx跨域配置好的情况下。最近遇到一个问题,就是yii2 restful带token请求,如果鉴权失败返回401,axios获取不到。找了半天发现是服务器端的问题。具体原理也不是很清楚,大体意思就是客户端请求有几个层次,鉴权的代码比较靠前,并没有用到nginx的跨域。所以,虽然接口正确返回了401,但是axios由于跨域限制取不到这个值。这个需要在yii2中深层次跨域设置。

3.第一个想到的就是在父级controller的behaviors中加入cors设置。这个是yii2自带的一个配置。但是发现客户端报错,意思是不能有两个相同的跨域域名。因为这样yii2的跨域设置和nginx的跨域设置冲突了。

4.找了半天,最后找到一个不是很完美的解决方案,就是在yii/filters/auth/AuthMethod.php里边加入了跨域的设置。因为实在没有找到其他什么地方,可以在authenticatior失败之前设置自定义header来跨域。

clipboard.png

5.当然,我觉得这个方法烂透了。因为yii2开发原则是尽量不要动vendor包。不知道有没有大神,能给我提供一个更好的方法。


弘道者人
48 声望1 粉丝