kmdd33
V2EX  ›  问与答

请教一个跨域的问题: No 'Access-Control-Allow-Origin' header ,参考了很多教程还是解决不了。

  •  
  •   kmdd33 · Mar 27, 2017 · 28655 views
    This topic created in 3513 days ago, the information mentioned may be changed or developed.
    参考的教程如下: http://serverfault.com/questions/162429/how-do-i-add-access-control-allow-origin-in-nginx 和 http://www.tuicool.com/articles/3aaQB3b 和 https://segmentfault.com/q/1010000003116113

    自己尝试在 nginx.conf 文件中添加了
    location / {
    add_header Access-Control-Allow-Origin *;
    }

    和



    location / {
    if ($request_method = 'OPTIONS') {
    add_header 'Access-Control-Allow-Origin' '*';
    #
    # Om nom nom cookies
    #
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    #
    # Custom headers and headers various browsers *should* be OK with but aren't
    #
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    #
    # Tell client that this pre-flight info is valid for 20 days
    #
    add_header 'Access-Control-Max-Age' 1728000;
    add_header 'Content-Type' 'text/plain charset=UTF-8';
    add_header 'Content-Length' 0;
    return 204;
    }
    if ($request_method = 'POST') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }
    if ($request_method = 'GET') {
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }
    }

    丝毫不起作用,求助后端伙伴们,怎么搞?
    console 里面的错误(不知道如何贴图,就只能贴 error 了)如下:

    XMLHttpRequest cannot load https://www.mydomain.com/?/ac... No 'Access-Control-Allow-Origin' header is present on the https://www.mydomain.com/?/ac... requested resource. Origin 'https://www.mydomain.com' is therefore not allowed access.
    43 replies  •  2017-03-29 10:37:54 +08:00
    ihuotui
    ihuotui
    Mar 27, 2017 via iPhone❤️1
    1
    cross.org 有所有跨域知识
    kmdd33
    kmdd33
    OP
    Mar 27, 2017❤️1
    2
    bayallen
    bayallen
    Mar 27, 2017
    3
    别上来就贴一大堆格式乱了的配置啊,起码得说具体点吧。
    fanwei
    fanwei
    Mar 27, 2017
    4
    确实应该说清楚环境。比如油猴脚本里如果用 jquery 怎么设置都会有上面这个提示。必须用对应的 GM 函数。
    kmdd33
    kmdd33
    OP
    Mar 27, 2017
    5
    环境是:军哥的 lnmp ,目前在输入服务器 ip 状态下用户可以登陆,@ferrum @ferrum @fanwei @ihuotui
    kmdd33
    kmdd33
    OP
    Mar 27, 2017 via iPad
    6
    自己用 Cloudflare 做了 301 跳转,无论是输入 mydomain.com 或者 www.domain.com 都会跳转到 https://www.mydomain.com
    johnny23
    johnny23
    Mar 27, 2017 via iPhone
    7
    我以前遇到这些问题 一怒之下把所有接口都做成 jsonp
    kmdd33
    kmdd33
    OP
    Mar 27, 2017
    8
    @johnny23 如何用 jsonp
    johnny23
    johnny23
    Mar 27, 2017 via iPhone
    9
    @kmdd33 额 网上教程一大堆 唯一区别就是返回字符串是一个带了 callback 函数的字符串而已
    ikaros
    ikaros
    Mar 27, 2017
    10
    我记得设置 * 好像是没用的, console 里的提示记得就是说当前 host 和*不匹配之类的, 你是真的需求让所有外部都可以访问? 我当时因为只有两个 host 需要做这个,于是就把这两个 host 存在一个 list 里面,然后看来访的 host 是不是在这个 list 里面,在的话就把这个 host 加到 header 里面
    Numbcoder
    Numbcoder
    Mar 27, 2017
    11
    把
    add_header 'Access-Control-Allow-Origin' '*';
    改成
    add_header Access-Control-Allow-Origin $http_origin;

    试试
    des
    des
    Mar 27, 2017
    12
    @ikaros 不知道是不是和地址有关, 127.0.0.1 是可以的

    kmdd33
    kmdd33
    OP
    Mar 28, 2017 via iPad
    13
    @ikaros 请问具体你是如何添加的呢?如果把*换成 https://www.mydomain.com. 放在自己的 Nginx.conf 文件里面,还是不行啊
    kmdd33
    kmdd33
    OP
    Mar 28, 2017 via iPad
    14
    @Numbcoder 按照你的方法,依然有错误
    Showfom
    Showfom
    PRO
    Mar 28, 2017 via iPhone
    15
    你没指定文件的后缀 我们的配置给你参考

    # Cross domain webfont access
    location = /favicon.ico { log_not_found off; access_log off; }

    location = /robots.txt { log_not_found off; access_log off; allow all; }

    location ~* .(ogg|ogv|mp4|css|rss|atom|js|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ {
    add_header "Access-Control-Allow-Origin" "*";
    add_header "Timing-Allow-Origin" "*";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    expires max;
    log_not_found off;
    }

    location ~* .(ttf|ttc|otf|eot|woff|woff2|svg|svgz)$ {
    add_header "Access-Control-Allow-Origin" "*";
    add_header "Timing-Allow-Origin" "*";
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    expires max;
    log_not_found off;
    }
    Showfom
    Showfom
    PRO
    Mar 28, 2017 via iPhone
    16
    preload 那段头部不是 https 可以忽略
    kmdd33
    kmdd33
    OP
    Mar 28, 2017 via iPad
    17
    @Showfom 是不是把你发的这段代码,也粘贴到我服务器上 Nginx.conf 文件里面?
    binux
    binux
    Mar 28, 2017
    18
    把返回头发出来啊, console 没有用
    Showfom
    Showfom
    PRO
    Mar 28, 2017 via iPhone
    19
    @kmdd33 嗯 用在 server 段
    ikaros
    ikaros
    Mar 28, 2017
    20
    @kmdd33 我不是配置在 nginx 里面的,我是在程序 handler 里面加的
    ikaros
    ikaros
    Mar 28, 2017
    21
    @des 好像不是, 是可以的, 不过一般感觉不会用*
    jugelizi
    jugelizi
    Mar 28, 2017
    22
    如果你要 post 就不能 *
    要指定域名就可以了
    MinonHeart
    MinonHeart
    Mar 28, 2017
    23
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Origin: *
    这两个不能一起用。 Credentials 为 true , Access-Control-Allow-Origin 使用具体的值
    kmdd33
    kmdd33
    OP
    Mar 28, 2017
    24
    @binux @MinonHeart @jugelizi @ikaros 响应头截图: https://cl.ly/3i30402Q3624/annotate ,求教育。
    kmdd33
    kmdd33
    OP
    Mar 28, 2017
    25
    @Showfom 把您发的配置代码粘贴到 nginx.conf 的 server 段,重启,还是老错误,麻烦你看看我发的响应头截图
    Showfom
    Showfom
    PRO
    Mar 28, 2017 via iPhone
    26
    @kmdd33 没空帮你看 你自己研究去吧
    kmdd33
    kmdd33
    OP
    Mar 28, 2017
    27
    @MinonHeart @Numbcoder 我把 Access-Control-Allow-Origin: * 中的*改成了 https://www.mydomain.com 还是不行。
    MinonHeart
    MinonHeart
    Mar 28, 2017
    28
    @kmdd33 你截图中的 origin 还是*
    jswh
    jswh
    Mar 28, 2017
    29
    ajax 在发送正式数据之前会先用 HEAD 请求一次。你 HEAD 没有加 Access-Control-Allow-Origin
    jswh
    jswh
    Mar 28, 2017
    30
    @jswh oh,记错了,是 options
    kmdd33
    kmdd33
    OP
    Mar 28, 2017
    31
    @MinonHeart 现在 Access-Control-Allow-Origin 里面既有*也有 https://www.mydomain.com , 我把我的 nginx.conf 也截图了,您再分析一下怎么回事? https://cl.ly/2Z3S3W1Y0j3F/annotate ( header 头) https://cl.ly/0O0f2Q402R3R/annotate ( nginx.conf 截图)
    kmdd33
    kmdd33
    OP
    Mar 28, 2017
    32
    Dlad
    Dlad
    Mar 28, 2017
    34
    后端代码里输出 Access-Control-Allow-Origin 头就可以了,现代浏览器都认识。
    ie8 需要引入额外的 js ,并对 ajax 请求有一定要求。
    ljcarsenal
    ljcarsenal
    Mar 28, 2017
    35
    你看看是不是报错的请求之前有个 option 方法的请求
    shuson
    shuson
    Mar 28, 2017
    36
    cors 配置没问题,应该是其他没注意到的地方的问题
    MinonHeart
    MinonHeart
    Mar 28, 2017
    37
    headers 中的同一个项不能多配,这东西又不是随便配的
    最终配出来是
    Access-Control-Allow-Credentials: true
    Access-Control-Allow-Origin: access-origin
    banksiae
    banksiae
    Mar 28, 2017
    38
    噗噗,前几天刚遇到这个问题, Access-Control-Allow-Origin 的问题,后端 set_header ; cookie 的问题,统一域名或者 url 后面加上类 cookie 就行了
    qinxi
    qinxi
    Mar 28, 2017
    39
    其实反向代理可以解决跨域,还是服务端无感知的
    kmdd33
    kmdd33
    OP
    Mar 28, 2017 via iPad
    40
    @qinxi @banksiae 具体请问怎么做呢?
    qinxi
    qinxi
    Mar 28, 2017
    41
    @kmdd33 你的页面在 a.com ,你的 api 在 b.com 那你在 a.com/api 反向代理到 b.com 就行了 .
    030
    030
    Mar 29, 2017
    42
    我前几天换 CloudFront 也碰到过这个,不过加了
    add_header Access-Control-Allow-Origin *;
    就好了,问题只是 CloudFront 会把 header cache ,好像和主题沒什么关系
    cst4you
    cst4you
    Mar 29, 2017
    43
    @qinxi 如果是多媒体类的资源文件你还反代来消耗自己流量吗 233333333
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4310 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 02:08 · PVG 10:08 · LAX 18:08 · JFK 21:08
    ♥ Do have faith in what you're doing.