前后端分離跨域問題解決

使用前后端分離(前端使用vue燕雁,react應(yīng)該也類似)的項目都離不開跨域問題诞丽,反反復(fù)復(fù)的經(jīng)歷過好幾次后,決定將目前最常用的三種解決方法做下記錄拐格,以免后面又在這一部分浪費(fèi)過多時間僧免。

1、 使用webpack提供的devServer來解決開發(fā)環(huán)境中跨域問題捏浊。這里用vue cli3創(chuàng)建的項目進(jìn)行說明

注意懂衩,這里僅限于開發(fā)環(huán)境,因為換到線上環(huán)境后金踪,我們會對vue項目進(jìn)行打包浊洞,這時候一般使用nginx進(jìn)行代理,就沒有devServer這個環(huán)境存在了胡岔。

  • 打開項目目錄下的vue.config.js文件法希,沒有的話,新建一個靶瘸。配置內(nèi)容如下苫亦。
module.exports = {
    devServer: {
        host: '0.0.0.0',  // 項目運(yùn)行的IP
        port: 8080,  // 項目運(yùn)行的端口
        https: false,
        // 開發(fā)環(huán)境跨域使用dev server解決
        proxy: {
            '/api': {    // 匹配到/api的接口請求,我們下面將所有api請求全部加上api標(biāo)識
                target: 'http://api-xxx.xxx.com',  // 要轉(zhuǎn)發(fā)到的我們的api接口地址
                changeOrigin: true,
                pathRewrite: {
                    '^/api': ''  // 這里將api這三個字符替換掉怨咪,變成我們接口真正的地址
                }
            }
        },
    }
}

target:轉(zhuǎn)發(fā)的后臺api地址
pathRewrite: 地址重寫規(guī)則

  • 在項目目錄下新建環(huán)境文件.env.development屋剑,配置全局變量
VUE_APP_API_BASE_URL = '/api'

這里我們使用axios進(jìn)行請求,因此诗眨,在我們封裝的請求文件中設(shè)置如下:

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

這樣的話唉匾,我們在接口請求中就不用了每個接口都手動加上/api這個標(biāo)識,axios請求會默認(rèn)加上該地址辽话。如我們的npm run server運(yùn)行時肄鸽,顯示:

image.png

則axios發(fā)出的api請求地址為 http://192.168.123.70:8080/api/接口地址,然后被devServer的進(jìn)行了代理油啤,將http://192.168.123.70:8080代理到了上面target配置的地址http://api-xxx.xxx.com典徘,且將api替換成了''(這個我們在用瀏覽器調(diào)試的時候是看不到轉(zhuǎn)換過程的,只會看到未轉(zhuǎn)換前的地址)益咬,這樣就可以不用改變我們的接口請求的代碼逮诲。

這里有個概念要說一下,上訴代理配置代理的源地址為http://192.168.123.70:8080幽告,如果我們在VUE_APP_API_BASE_URL里寫了我們接口的域名前綴梅鹦,如http://api-xxx.xxx.com/api,則不會被devServer的proxy代理到冗锁,導(dǎo)致代理無效齐唆。也就是說要從http://192.168.123.70:8080發(fā)出去的請求才會被代理到。

2冻河、使用nginx進(jìn)行代理轉(zhuǎn)發(fā)箍邮,可在線上環(huán)境使用

  • 在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里加入如下設(shè)置:
header('content-type:application:json;charset=utf8');
// 指定允許其他域名訪問
header('Access-Control-Allow-Origin:*');
// 響應(yīng)類型
header('Access-Control-Allow-Methods:POST, GET, OPTIONS');
// 響應(yīng)頭設(shè)置
header('Access-Control-Allow-Headers:authorization,x-requested-with,content-type');
  • 使用框架的話锭弊,如laravel堪澎,可以新建一個中間件

php artisan make:middleware EnableCrossRequest

修改該文件,新建一個handle函數(shù)(如果沒有)味滞,加入:

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的返回字段中缺少什么昨凡,再進(jìn)行相應(yīng)的添加

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末攒暇,一起剝皮案震驚了整個濱河市土匀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌形用,老刑警劉巖就轧,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異田度,居然都是意外死亡妒御,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門镇饺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乎莉,“玉大人,你說我怎么就攤上這事奸笤⊥锟校” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵监右,是天一觀的道長边灭。 經(jīng)常有香客問我,道長健盒,這世上最難降的妖魔是什么绒瘦? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮扣癣,結(jié)果婚禮上惰帽,老公的妹妹穿的比我還像新娘。我一直安慰自己父虑,他們只是感情好该酗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著士嚎,像睡著了一般垂涯。 火紅的嫁衣襯著肌膚如雪烁焙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天耕赘,我揣著相機(jī)與錄音,去河邊找鬼膳殷。 笑死操骡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赚窃。 我是一名探鬼主播册招,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼勒极!你這毒婦竟也來了是掰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤辱匿,失蹤者是張志新(化名)和其女友劉穎键痛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匾七,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡絮短,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了昨忆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丁频。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邑贴,靈堂內(nèi)的尸體忽然破棺而出席里,到底是詐尸還是另有隱情,我是刑警寧澤拢驾,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布奖磁,位于F島的核電站,受9級特大地震影響独旷,放射性物質(zhì)發(fā)生泄漏署穗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一嵌洼、第九天 我趴在偏房一處隱蔽的房頂上張望案疲。 院中可真熱鬧,春花似錦麻养、人聲如沸褐啡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽备畦。三九已至低飒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂盐,已是汗流浹背褥赊。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉恼,地道東北人拌喉。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像俐银,于是被迫代替她去往敵國和親尿背。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容