V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anai1943
V2EX  ›  前端开发

jquery 二级域名跨域

  •  
  •   anai1943 · 2016-01-19 20:59:09 +08:00 · 4535 次点击
    这是一个创建于 3222 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT ,用户服务网站的时候,有时候是用 abc.com 打开,有时候用 www.abc.com , jquery 发送 ajax 请求的时候,如果用户是用 abc.com 访问的,发送请求时如果用 www.abc.com ,获取不到数据,这种情况通常怎么解决呢?

    16 条回复    2016-01-19 23:24:37 +08:00
    abelyao
        1
    abelyao  
       2016-01-19 21:12:24 +08:00 via iPhone
    如果是 AJAX 的话服务端可以设置允许跨域啊,这样的问题随便搜一下都一堆解决方式…
    anai1943
        2
    anai1943  
    OP
       2016-01-19 21:19:30 +08:00
    @abelyao 服务器端设置跨域后,会带来安全问题么?
    yangxiongwei
        3
    yangxiongwei  
       2016-01-19 21:23:57 +08:00
    js 里面用相对路径发请求啊,斜杠开头
    gamexg
        4
    gamexg  
       2016-01-19 21:25:56 +08:00 via Android
    可以限制可跨域的域名。
    更好的解决办法是 abc. com 重定向到 www.abc. com.

    ajax 硬编码的域名?
    lxrmido
        5
    lxrmido  
       2016-01-19 21:35:25 +08:00
    1 、在 www.abc.com 下做个中转页面,这个页面里设置 document.domain 为 abc.com ,在这个页面里写个 ajax 函数;
    2 、 abc.com 的页面中建个 iframe , iframe 指向上面建立的中转页面,然后要 ajax 时调用上面的 ajax 函数。
    anai1943
        6
    anai1943  
    OP
       2016-01-19 21:35:27 +08:00
    @yangxiongwei @gamexg
    恩 部分 ajax 请求就是这么写的,斜杠开头。
    现在时有一个特殊的场景,发送 ajax 的 url 是后端生成的 html 里面取的,蛋疼。不想改动 nginx 的配置文件了。用$_SERVER['HTTP_HOST']来识别访问的 url 是否是有 www ,后端处理了。。。
    zkd8907
        7
    zkd8907  
       2016-01-19 21:37:24 +08:00
    jsonp 方法,后台返回类似_Callback({..})格式的数据
    anai1943
        8
    anai1943  
    OP
       2016-01-19 21:38:23 +08:00
    @zkd8907 jsonp 不太合适,别人也能调用这个接口了,不安全吧。
    hxsf
        9
    hxsf  
       2016-01-19 21:43:33 +08:00
    js 里 用 location.host 来代替就行
    Zzzzzzzzz
        10
    Zzzzzzzzz  
       2016-01-19 21:46:50 +08:00
    服务器输出相应 CORS 头就行, IE8 和 IE9 的话可以用 XDomainRequest,jquery 的话引用个第三方 transport 可以支持.

    不过你带不带 www 都是同一个, 就请求的绝对链接有问题的话直接 hack 一下 ajax 函数的入口把 url 清理一下就好了.
    abelyao
        11
    abelyao  
       2016-01-19 21:47:54 +08:00 via iPhone
    @anai1943 不要用 * 这种通配符,只写允许跨域调用的域名就行
    sneezry
        12
    sneezry  
       2016-01-19 21:48:45 +08:00
    问题本身的解决办法:用相对路径替代绝对路径

    问题本身反映的问题, www 与不带 www 是两个不同的网站,如果输出相同的内容,应该做 301 跳转,这样对用户方便,对搜索引擎友好,也不会被搜索引擎降权
    Felldeadbird
        13
    Felldeadbird  
       2016-01-19 22:38:07 +08:00
    以 PHP 为例,
    header("Access-Control-Allow-Origin:*");
    header('Access-Control-Allow-Methods:POST,GET');
    header('Access-Control-Allow-Credentials:true');
    第一行就是声明那些来源域名允许跨域。 其他语言也差不多这样设置。
    至于安全嘛,这些跨域会产生什么安全呢?还有, ajax 即使不声明上述的设置,人家 ajax post 内容一样会到你后端去。所以 在后面 我通常会再判断是否 白名单域名,不是就直接终止运行。
    ccbikai
        14
    ccbikai  
       2016-01-19 22:56:58 +08:00
    $.ajax('/test') 路径这样写
    adeweb
        15
    adeweb  
       2016-01-19 23:20:13 +08:00 via iPhone
    jsonp ,回调的函数名是一个约定生成的随机字符,比如 Callback84jdg4q9p({})。
    adeweb
        16
    adeweb  
       2016-01-19 23:24:37 +08:00
    @adeweb 看错了以为是不同的网站内容。相对路径就可以了,但建议还是做 301 跳转。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5986 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:26 · PVG 10:26 · LAX 18:26 · JFK 21:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.