前后端分离跨域问题解决

使用前后端分离(前端使用vue,react应该也类似)的项目都离不开跨域问题,反反复复的经历过好几次后,决定将目前最常用的三种解决方法做下记录,以免后面又在这一部分浪费过多时间。

1、 使用webpack提供的devServer来解决开发环境中跨域问题。这里用vue cli3创建的项目进行说明

注意,这里仅限于开发环境,因为换到线上环境后,我们会对vue项目进行打包,这时候一般使用nginx进行代理,就没有devServer这个环境存在了。

  • 打开项目目录下的vue.config.js文件,没有的话,新建一个。配置内容如下。
module.exports = {
    devServer: {
        host: '0.0.0.0',  // 项目运行的IP
        port: 8080,  // 项目运行的端口
        https: false,
        // 开发环境跨域使用dev server解决
        proxy: {
            '/api': {    // 匹配到/api的接口请求,我们下面将所有api请求全部加上api标识
                target: 'http://api-xxx.xxx.com',  // 要转发到的我们的api接口地址
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''  // 这里将api这三个字符替换掉,变成我们接口真正的地址
                }
            }
        },
    }
}

target:转发的后台api地址
pathRewrite: 地址重写规则

  • 在项目目录下新建环境文件.env.development,配置全局变量
VUE_APP_API_BASE_URL = '/api'

这里我们使用axios进行请求,因此,在我们封装的请求文件中设置如下:

axios.defaults.baseURL = process.env.VUE_APP_API_BASE_URL;

这样的话,我们在接口请求中就不用了每个接口都手动加上/api这个标识,axios请求会默认加上该地址。如我们的npm run server运行时,显示:

image.png

则axios发出的api请求地址为 http://192.168.123.70:8080/api/接口地址,然后被devServer的进行了代理,将http://192.168.123.70:8080代理到了上面target配置的地址http://api-xxx.xxx.com,且将api替换成了''(这个我们在用浏览器调试的时候是看不到转换过程的,只会看到未转换前的地址),这样就可以不用改变我们的接口请求的代码。

这里有个概念要说一下,上诉代理配置代理的源地址为http://192.168.123.70:8080,如果我们在VUE_APP_API_BASE_URL里写了我们接口的域名前缀,如http://api-xxx.xxx.com/api,则不会被devServer的proxy代理到,导致代理无效。也就是说要从http://192.168.123.70:8080发出去的请求才会被代理到。

2、使用nginx进行代理转发,可在线上环境使用

  • 在nginx配置文件(代理vue项目访问地址)中加上:
        location /api {
            rewrite    ^(.*)\/api(.*)$    $1$2;
        }

        location /api {
             add_header 'Access-Control-Allow-Origin' '*';
             proxy_pass https://api-xxx.xxx.com;
        }

3、在php项目中允许跨域请求(一劳永逸)

  • 在请求的入口文件,如index.php里加入如下设置:
header('content-type:application:json;charset=utf8');
// 指定允许其他域名访问
header('Access-Control-Allow-Origin:*');
// 响应类型
header('Access-Control-Allow-Methods:POST, GET, OPTIONS');
// 响应头设置
header('Access-Control-Allow-Headers:authorization,x-requested-with,content-type');
  • 使用框架的话,如laravel,可以新建一个中间件

php artisan make:middleware EnableCrossRequest

修改该文件,新建一个handle函数(如果没有),加入:

public function handle($request, Closure $next)
    {
        $response = $next($request);

        $origin = $request->server('HTTP_ORIGIN') ? $request->server('HTTP_ORIGIN') : '';
        $allow_origin = [
            'http://192.168.123.70:8080',
        ];
        if (in_array($origin, $allow_origin)) {
            $response->header('Access-Control-Allow-Origin', $origin);
            $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, authenticated');
            $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
            $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
            $response->header('Access-Control-Allow-Credentials', 'true');
        }

        return $response;
    }

然后在Http > Kernel.php中的变量$middleware中加入该中间件

image.png

这样就大功告成,如果遇到还有报错,则可以看浏览器的console报错信息,看是否是header的返回字段中缺少什么,再进行相应的添加

参考:
https://learnku.com/articles/6504/laravel-cross-domain-solution
跨域原理解析,讲的挺好的:https://juejin.im/post/5cef28af51882550d41745ea

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容