CORS其实很简单:NGINX 一招搞定针对特定域名和端口跨域,动态决定跨域到哪里

原创
2016/03/03 16:23
阅读数 771

1. 需求来由

很多前端筒子老想着跨域,这可不是什么特别的事情,可是要支持不暴露我要支持的跨域域名这就有难度了? 嘿嘿嘿,可以想想,只有访问的时候我才说,额,你是可以跨域的!于是乎这份动态跨域的配置就出路咯!! 思路: 正则匹配到来源,然后根据来源决定跨啥域。当然,正则决定了你要给谁跨。 废话不多说,看代码。

可能有筒子问题,为啥不用联合条件,我要说,nginx不兹磁~~~orZ

当然,下面的设置仅允许GET跨,你还可以设置各种METHOD条件, have fun :-)

2. 干货

2.1 本地调试内网测试环境

1.支持开发 : 正文使用了正则1: ^(http:\/\/(?:(?:(foo|bar).fuck.com|\d+\.\d+\.\d+\.\d+)(?:[:]\d+)?))?\/.*$

主要解决内网中前端筒子用ip+port调试本地代码访问内网测试环境api的问题,同时也兼容内网测试环境域名访问。

看,我对前端筒子不要太好~~

2.2 线上环境

^(http:\/\/(?:(?:(foo|bar).fuck.com|123.123.123.123)))?\/.*$

该表达式则指明了至此特定域名和ip,但不带端口号(线上带个端口别扭不?)

好了好了,看了这么多,我知道你要脱裤子了,我来帮你 :P

3. 代码

   # serve  配置片段
    set $flag 0;
    set $ref_host '';
    set $ref_url '';
    if ($http_referer ~ ^(http:\/\/(?:(?:(foo|bar).fuck.com|\d+\.\d+\.\d+\.\d+)(?:[:]\d+)?))?\/.*$) {
        set $ref_host $2;
        set $ref_url  $1;
        set $flag 1;
    }
    set $flag_uri 0;
    if ($uri = /fuck_some_url.php) {
        set $flag_uri 1;
    }

    if ($flag = 1) {
        set $flag_uri 2;
    }

    if ( $flag_uri = 2) {
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Methods GET;
        add_header Access-Control-Allow-Origin $ref_url;
    }

展开阅读全文
打赏
1
6 收藏
分享
加载中
更多评论
打赏
0 评论
6 收藏
1
分享
返回顶部
顶部