解決vue-cli項目開發中跨域問題


一、開發環境中跨域

使用 Vue-cli 創建的項目,開發地址是 localhost:8080,需要訪問非本機上的接口http://10.1.0.34:8000/queryRole。不同域名之間的訪問,需要跨域才能正確請求。跨域的方法很多,通常都需要后台配置,不過 Vue-cli 創建的項目,可以直接利用 Node.js 代理服務器,通過修改vue proxyTable接口實現跨域請求。在vue-cli項目中的config文件夾下的index.js配置文件中,修改前的dev:

dev: {  
    env: require('./dev.env'),  
    port: 8080,  
    autoOpenBrowser: true,  
    assetsSubDirectory: 'static',  
    assetsPublicPath: '/',  
    proxyTable: {}, 
    cssSourceMap: false  
  }

只要修改里面的proxyTable: {}項

dev: {

    // 靜態資源文件夾
    assetsSubDirectory: 'static',

    // 發布路徑
    assetsPublicPath: '/',

    // 代理配置表,在這里可以配置特定的請求代理到對應的API接口
    // 例如將'localhost:8080/api/xxx'代理到'www.example.com/api/xxx'
    // 使用方法:https://vuejs-templates.github.io/webpack/proxy.html
    proxyTable: {
      '/api': {
        target: 'http://xxxxxx.com', // 接口的域名
        // secure: false,  // 如果是https接口,需要配置這個參數
        changeOrigin: true, // 如果接口跨域,需要進行這個參數配置,為true的話,請求的header將會設置為匹配目標服務器的規則(Access-Control-Allow-Origin)
  pathRewrite: { '^/api': '' //本身的接口地址沒有 '/api' 這種通用前綴,所以要rewrite,如果本身有則去掉 
 } } }, // 本地訪問 http://localhost:8080 host: 'localhost', // can be overwritten by process.env.HOST

然后重啟項目npm run dev

注意:

接口地址原本是 /save/index,但是為了匹配代理地址,在前面加一個 /api,  因此接口地址需要寫成這樣的即可生效 /api/save/index。

'/api' 為匹配項,target 為被請求的地址,因為在 ajax 的 url 中加了前綴 '/api',而原本的接口是沒有這個前綴的,所以需要通過 pathRewrite 來重寫地址,將前綴 '/api' 轉為 '/'。如果本身的接口地址就有 '/api' 這種通用前綴,就可以把 pathRewrite 刪掉。

1、參數proxyTable詳解:

vue-cli的config文件里的參數:proxyTable,這個參數主要是一個地址映射表,你可以通過設置將復雜的url簡化,例如我們要請求的地址是api.xxxxxxxx.com/list/1,可以按照如下設置:

proxyTable: {
  '/list': {
    target: 'http://api.xxxxxxxx.com',
    pathRewrite: {
      '^/list': '/list'
    }
  }
}

這樣我們在寫url的時候,只用寫成/list/1就可以代表api.xxxxxxxx.com/list/1.
那么又是如何解決跨域問題的呢?其實在上面的'list'的參數里有一個changeOrigin參數,接收一個布爾值,如果設置為true,那么本地會虛擬一個服務端接收你的請求並代你發送該請求,這樣就不會有跨域問題了,當然這只適用於開發環境。增加的代碼如下所示:

proxyTable: {
  '/list': {
    target: 'http://api.xxxxxxxx.com',
    changeOrigin: true,
    pathRewrite: {
      '^/list': '/list'
    }
  }
}

vue-cli的這個設置來自於其使用的插件http-proxy-middleware

github:https://github.com/chimurai/http-proxy-middleware

深入了解的話可以看該插件配置說明,似乎還支持websocket,很強大的插件。

2、pathRewrite含義:

用代理,首先你得有一個標識,告訴他你這個連接要用代理,不然的話,可能你的 html,css,js這些靜態資源都跑去代理。所以我們只要接口用代理,靜態文件用本地。'/iclient': {}, 就是告訴node,我接口只要是'/iclient'開頭的才用代理。所以你的接口就要這么寫 /iclient/xx/xx。最后代理的路徑就是 http://xxx.xx.com/iclient/xx/xx。可是不對啊,我正確的接口路徑里面沒有/iclient啊,所以就需要pathRewrite,'^/iclient':'', 把'/iclient'去掉,這樣既能有正確標識,又能在請求接口的時候去掉iclient。當然如果本身的接口中就有/iclient,那么就可以把pathRewrite這個參數去掉。

二、在生產環境中跨域

設置nginx配置文件:

location /api {
    add_header 'Access-Control-Allow-Origin' '*';
    proxy_pass http://fanyi.baidu.com/v2transapi;
}

 

三、設置不同的接口地址

  平常我們團隊開發時都在公司的局域網內,調用接口也是局域網內部的,但是項目上線時,請求接口是線上服務器端的,那么就有接口之間的來回切換問題。

  在使用vue-cli搭建項目以后,做相關配置就可以實現,不用手動更改接口路徑,也可以請求不同環境下的接口。

  1、設置不同的接口地址

  先找到以下文件

  /config/dev.env.js

  /config/prod.env.js

  可以看到dev.env.js里面內容如下

這是生產環境的參數配置,然后我們可以再上面文件加入一行代碼,如下:這就是本地測試環境請求后台接口的域名

然后找到prod.env.js文件,如下:

我們加入一行代碼,如下:這是我們上傳服務器以后,請求后台接口的域名

2、在代碼中調用設置好的參數:

比如我在本項目中重新封裝axios(api文件在/src/api/index.js中),將配置好的接口地址作為baseURL拼接到接口路徑中,應用參數部分如下:

最后重新啟動項目就可以了,當npm run dev的時候就運行在生產環境,當npm run build的時候就是正式的線上環境。

 后端程序代理

有一種方法不需要后端的配合和修改服務器配置 ,我們自己就可以做到。就是我們自己啟一個后端程序做代理。然后把所有的請求轉發到服務器。這里要用到node的一個包http-proxy-middleware。關鍵代碼(express)如下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM