V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Prkom
V2EX  ›  问与答

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

  •  
  •   Prkom · 2021-05-05 15:55:05 +08:00 · 2590 次点击
    这是一个创建于 1299 天前的主题,其中的信息可能已经有所发展或是发生改变。

    报错信息如下: 报错信息

    前端是 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');
    
    第 1 条附言  ·  2021-05-06 08:53:59 +08:00

    经评论提醒,附加一下 Response Headers

    第 2 条附言  ·  2021-05-06 09:44:47 +08:00

    感谢各位回复,我补充下返回结果:

    同一个接口共两次请求,包括预检请求和数据请求

    预检即 option 请求正常;数据请求会报跨域错误

    另外:错误是时不时出现的,多刷新几次可以解决。使用 postman 测试过多次,只会偶尔出现加载时间长的现象,没有报错

    18 条回复    2021-05-06 11:50:57 +08:00
    2020beBetter
        1
    2020beBetter  
       2021-05-05 15:56:37 +08:00
    有负载?
    Prkom
        2
    Prkom  
    OP
       2021-05-05 15:59:28 +08:00
    @2020beBetter 没,是单服务器
    treblex
        3
    treblex  
       2021-05-05 16:35:08 +08:00   ❤️ 1
    是不是跨域之前有其他的拦截器报错了,比如鉴权之类的,还有就是如果 method==options 的话,需要返回 204
    Prkom
        4
    Prkom  
    OP
       2021-05-05 16:56:24 +08:00
    @treblex 你好,想请教下拦截器指的是什么,该怎么去排查呢?
    现在每个接口在请求前确实会有预检即 options 方法的请求,直接返回的是 200,不知道非 204 会有什么影响。
    最诡异的是大部分情况下都可以正常请求访问,一般在长时间未访问后第一次请求会出现跨域错误,多刷新几次可以解决。
    treblex
        5
    treblex  
       2021-05-05 17:50:01 +08:00   ❤️ 1
    @Prkom 像 nodejs 和 go 的 web 框架有中间件的概念,记得在 thinkphp 里应该是依靠继承实现的,类似 beasController AuthController 之类的吧
    就是一个请求进来之后处理的顺序,跨域的代码应该是再最前边的,之后再处理鉴权,路由,其他的事情

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

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

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

    地址的话因为是内部工具,不太方便发出来😢,我继续查下吧,谢了~
    zzlatan
        7
    zzlatan  
       2021-05-05 19:21:51 +08:00
    有没有中间代理什么的
    iyaozhen
        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 中的域名
    Ptu2sha
        9
    Ptu2sha  
       2021-05-05 20:52:00 +08:00
    盲猜这是接口出错了 看错误日志吧
    你这里返回允许跨域只在后端 200 状态下有效 异常下没有返回
    leyviw
        10
    leyviw  
       2021-05-05 23:35:51 +08:00 via iPhone
    一般就是接口响应错误了, 用 postman 看看
    weixiangzhe
        11
    weixiangzhe  
       2021-05-06 07:44:02 +08:00 via iPhone   ❤️ 1
    复杂请求 不能写*,让后台在非生产取 origin 的 header 吧
    Prkom
        12
    Prkom  
    OP
       2021-05-06 08:55:27 +08:00
    @iyaozhen 感谢指教,已更改写法,确实更优。另外响应头也附加上去了,还望有空帮忙看下~
    Prkom
        13
    Prkom  
    OP
       2021-05-06 08:58:12 +08:00
    @leyviw 之前有用 postman 查看过没有发现过问题
    uTOmOuk3L6sb4MSI
        14
    uTOmOuk3L6sb4MSI  
       2021-05-06 09:01:37 +08:00 via iPhone
    非简单请求,不能直接*号,需要返回对应主机名
    bsg1992
        15
    bsg1992  
       2021-05-06 09:07:10 +08:00
    虽然你配置了跨域,但是接口报错或者其他问题导致不通前端就会提示跨域错误。
    iyaozhen
        16
    iyaozhen  
       2021-05-06 09:20:22 +08:00 via Android
    @Prkom 咦,http code 呢?是不是非 200 了
    Prkom
        17
    Prkom  
    OP
       2021-05-06 09:45:27 +08:00
    @iyaozhen 是的,状态显示为 CORS error
    houzhiqiang
        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 进行修改。如果操作失败,将会抛出异常。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1001 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:09 · PVG 03:09 · LAX 11:09 · JFK 14:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.