跨域问题,为什么配置了参数还会时不时出现

2021-05-05 15:55:05 +08:00
 Prkom

报错信息如下:

前端是 Ant Design,后端是 PHP 写的接口,服务器是 Apache

放在本地没有问题,放到线上之后偶尔会出现这个问题,多刷新几次会解决

大家有没有遇到过类似的问题,被卡住一周了,跪求指教

后端配置如下:

header("Content-Type:text/html;charset=utf-8");
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:*');
header('Access-Control-Allow-Headers:x-requested-with,content-type');
2612 次点击
所在节点    问与答
18 条回复
2020beBetter
2021-05-05 15:56:37 +08:00
有负载?
Prkom
2021-05-05 15:59:28 +08:00
@2020beBetter 没,是单服务器
treblex
2021-05-05 16:35:08 +08:00
是不是跨域之前有其他的拦截器报错了,比如鉴权之类的,还有就是如果 method==options 的话,需要返回 204
Prkom
2021-05-05 16:56:24 +08:00
@treblex 你好,想请教下拦截器指的是什么,该怎么去排查呢?
现在每个接口在请求前确实会有预检即 options 方法的请求,直接返回的是 200,不知道非 204 会有什么影响。
最诡异的是大部分情况下都可以正常请求访问,一般在长时间未访问后第一次请求会出现跨域错误,多刷新几次可以解决。
treblex
2021-05-05 17:50:01 +08:00
@Prkom 像 nodejs 和 go 的 web 框架有中间件的概念,记得在 thinkphp 里应该是依靠继承实现的,类似 beasController AuthController 之类的吧
就是一个请求进来之后处理的顺序,跨域的代码应该是再最前边的,之后再处理鉴权,路由,其他的事情

200 和 204 应该都可以,http 规范应该是 204,但是都表示请求成功

有线上地址的话,发一下看看吧
Prkom
2021-05-05 18:22:40 +08:00
@treblex 多谢回复,那我明白“拦截”了,跨域代码是在最前面没有问题的~ 而且是拦截问题的话我觉的不应该出现时好时坏的情况,猜测是服务器上的问题;

是的,查了下 204 No Content 会更加规范,也可以节省网络资源;

地址的话因为是内部工具,不太方便发出来😢,我继续查下吧,谢了~
zzlatan
2021-05-05 19:21:51 +08:00
有没有中间代理什么的
iyaozhen
2021-05-05 19:46:53 +08:00
你至少把 block 那次的 response header 发下,看看到底返回了什么,坑

其实*不建议这样写,比如:对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS

实际应该通过 request header 中的 origin 判断域名,如果在白名单中,则返回 origin 中的域名
Ptu2sha
2021-05-05 20:52:00 +08:00
盲猜这是接口出错了 看错误日志吧
你这里返回允许跨域只在后端 200 状态下有效 异常下没有返回
leyviw
2021-05-05 23:35:51 +08:00
一般就是接口响应错误了, 用 postman 看看
weixiangzhe
2021-05-06 07:44:02 +08:00
复杂请求 不能写*,让后台在非生产取 origin 的 header 吧
Prkom
2021-05-06 08:55:27 +08:00
@iyaozhen 感谢指教,已更改写法,确实更优。另外响应头也附加上去了,还望有空帮忙看下~
Prkom
2021-05-06 08:58:12 +08:00
@leyviw 之前有用 postman 查看过没有发现过问题
uTOmOuk3L6sb4MSI
2021-05-06 09:01:37 +08:00
非简单请求,不能直接*号,需要返回对应主机名
bsg1992
2021-05-06 09:07:10 +08:00
虽然你配置了跨域,但是接口报错或者其他问题导致不通前端就会提示跨域错误。
iyaozhen
2021-05-06 09:20:22 +08:00
@Prkom 咦,http code 呢?是不是非 200 了
Prkom
2021-05-06 09:45:27 +08:00
@iyaozhen 是的,状态显示为 CORS error
houzhiqiang
2021-05-06 11:50:57 +08:00
上面已经有两个人给出了答案,就是 非简单请求 Access-Control-Allow-Origin 这个头不能反回 *


https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
附带身份凭证的请求与通配符
对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。

这是因为请求的首部中携带了 Cookie 信息,如果 Access-Control-Allow-Origin 的值为“*”,请求将会失败。而将 Access-Control-Allow-Origin 的值设置为 http://foo.example,则请求将成功执行。

另外,响应首部中也携带了 Set-Cookie 字段,尝试对 Cookie 进行修改。如果操作失败,将会抛出异常。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774987

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX