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

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

  •  
  •   Prkom · 206 天前 · 1274 次点击
    这是一个创建于 206 天前的主题,其中的信息可能已经有所发展或是发生改变。

    报错信息如下: 报错信息

    前端是 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 条附言  ·  205 天前

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

    第 2 条附言  ·  205 天前

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

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

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

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

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

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

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

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

    地址的话因为是内部工具,不太方便发出来😢,我继续查下吧,谢了~
    zzlatan
        7
    zzlatan   205 天前
    有没有中间代理什么的
    iyaozhen
        8
    iyaozhen   205 天前   ❤️ 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   205 天前
    盲猜这是接口出错了 看错误日志吧
    你这里返回允许跨域只在后端 200 状态下有效 异常下没有返回
    leyviw
        10
    leyviw   205 天前 via iPhone
    一般就是接口响应错误了, 用 postman 看看
    weixiangzhe
        11
    weixiangzhe   205 天前 via iPhone   ❤️ 1
    复杂请求 不能写*,让后台在非生产取 origin 的 header 吧
    Prkom
        12
    Prkom   205 天前
    @iyaozhen 感谢指教,已更改写法,确实更优。另外响应头也附加上去了,还望有空帮忙看下~
    Prkom
        13
    Prkom   205 天前
    @leyviw 之前有用 postman 查看过没有发现过问题
    ODD10
        14
    ODD10   205 天前 via iPhone
    非简单请求,不能直接*号,需要返回对应主机名
    bsg1992
        15
    bsg1992   205 天前
    虽然你配置了跨域,但是接口报错或者其他问题导致不通前端就会提示跨域错误。
    iyaozhen
        16
    iyaozhen   205 天前 via Android
    @Prkom 咦,http code 呢?是不是非 200 了
    Prkom
        17
    Prkom   205 天前
    @iyaozhen 是的,状态显示为 CORS error
    houzhiqiang
        18
    houzhiqiang   205 天前
    上面已经有两个人给出了答案,就是 非简单请求 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   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2305 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 09:24 · PVG 17:24 · LAX 01:24 · JFK 04:24
    ♥ Do have faith in what you're doing.