报错信息如下:
前端是 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');
经评论提醒,附加一下 Response Headers
感谢各位回复,我补充下返回结果:
同一个接口共两次请求,包括预检请求和数据请求
预检即 option 请求正常;数据请求会报跨域错误
另外:错误是时不时出现的,多刷新几次可以解决。使用 postman 测试过多次,只会偶尔出现加载时间长的现象,没有报错
1
2020beBetter 2021-05-05 15:56:37 +08:00
有负载?
|
2
Prkom OP @2020beBetter 没,是单服务器
|
3
treblex 2021-05-05 16:35:08 +08:00 1
是不是跨域之前有其他的拦截器报错了,比如鉴权之类的,还有就是如果 method==options 的话,需要返回 204
|
4
Prkom OP @treblex 你好,想请教下拦截器指的是什么,该怎么去排查呢?
现在每个接口在请求前确实会有预检即 options 方法的请求,直接返回的是 200,不知道非 204 会有什么影响。 最诡异的是大部分情况下都可以正常请求访问,一般在长时间未访问后第一次请求会出现跨域错误,多刷新几次可以解决。 |
5
treblex 2021-05-05 17:50:01 +08:00 1
@Prkom 像 nodejs 和 go 的 web 框架有中间件的概念,记得在 thinkphp 里应该是依靠继承实现的,类似 beasController AuthController 之类的吧
就是一个请求进来之后处理的顺序,跨域的代码应该是再最前边的,之后再处理鉴权,路由,其他的事情 200 和 204 应该都可以,http 规范应该是 204,但是都表示请求成功 有线上地址的话,发一下看看吧 |
6
Prkom OP @treblex 多谢回复,那我明白“拦截”了,跨域代码是在最前面没有问题的~ 而且是拦截问题的话我觉的不应该出现时好时坏的情况,猜测是服务器上的问题;
是的,查了下 204 No Content 会更加规范,也可以节省网络资源; 地址的话因为是内部工具,不太方便发出来😢,我继续查下吧,谢了~ |
7
zzlatan 2021-05-05 19:21:51 +08:00
有没有中间代理什么的
|
8
iyaozhen 2021-05-05 19:46:53 +08:00 1
你至少把 block 那次的 response header 发下,看看到底返回了什么,坑
其实*不建议这样写,比如:对于附带身份凭证的请求,服务器不得设置 Access-Control-Allow-Origin 的值为“*”。 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS 实际应该通过 request header 中的 origin 判断域名,如果在白名单中,则返回 origin 中的域名 |
9
Ptu2sha 2021-05-05 20:52:00 +08:00
盲猜这是接口出错了 看错误日志吧
你这里返回允许跨域只在后端 200 状态下有效 异常下没有返回 |
10
leyviw 2021-05-05 23:35:51 +08:00 via iPhone
一般就是接口响应错误了, 用 postman 看看
|
11
weixiangzhe 2021-05-06 07:44:02 +08:00 via iPhone 1
复杂请求 不能写*,让后台在非生产取 origin 的 header 吧
|
14
uTOmOuk3L6sb4MSI 2021-05-06 09:01:37 +08:00 via iPhone
非简单请求,不能直接*号,需要返回对应主机名
|
15
bsg1992 2021-05-06 09:07:10 +08:00
虽然你配置了跨域,但是接口报错或者其他问题导致不通前端就会提示跨域错误。
|
18
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 进行修改。如果操作失败,将会抛出异常。 |