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;
}