CORS其實很簡單:NGINX 一招搞定針對特定域名和端口跨域,動態決定跨域到哪裏

1. 需求來由

不少前端筒子老想着跨域,這可不是什麼特別的事情,但是要支持不暴露我要支持的跨域域名這就有難度了? 嘿嘿嘿,能夠想一想,只有訪問的時候我才說,額,你是能夠跨域的!因而乎這份動態跨域的配置就出路咯!! 思路: 正則匹配到來源,而後根據來源決定跨啥域。固然,正則決定了你要給誰跨。 廢話很少說,看代碼。php

可能有筒子問題,爲啥不用聯合條件,我要說,nginx不茲磁~~~orZ前端

固然,下面的設置僅容許GET跨,你還能夠設置各類METHOD條件, have fun :-)nginx

2. 乾貨

2.1 本地調試內網測試環境

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

主要解決內網中前端筒子用ip+port調試本地代碼訪問內網測試環境api的問題,同時也兼容內網測試環境域名訪問。跨域

看,我對前端筒子不要太好~~測試

2.2 線上環境

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

該表達式則指明瞭至此特定域名和ip,但不帶端口號(線上帶個端口彆扭不?)調試

好了好了,看了這麼多,我知道你要脫褲子了,我來幫你 :Pcode

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;
    }
相關文章
相關標籤/搜索