通常情況下的Vue應用都使用Nginx部署,Nginx有專門的反向代理設置,但若將Vue應用部署在IIS中,針對Vue應用中設置的接口跨域,IIS需要進行反向代理設置。
跨域的設置分為開發環境和生產環境,在Vue-cli搭建的應用,開發環境解決跨域通常是在配置文件中使用proxy進行反代理,生產環境則需要使用反向代理。
Nginx的反向代理不做介紹,網上有很多,本文主要介紹IIS中設置反向代理。
步驟
一、IIS中安裝ARR(Application Request Routing Cache),下載地址:
https://www.iis.net/downloads/microsoft/application-request-routing
二、IIS中安裝urlrewrite,下載地址:
https://www.iis.net/downloads/microsoft/url-rewrite
三、配置ARR
1.重新打開iis,找到Application Request Routing Cache,打開功能
2.然后選擇Proxy,點擊按鈕
選擇啟用代理,並應用設置
Enabled proxy:打勾
HTTP version:HTTP/1.1(默認是pass through)
四、配置url重寫
選擇部署的網站,點擊url重寫 打開功能,右側添加規則
選擇默認的空白入站規則:
編寫相關信息,名字自己定,主要是配置操作
附上我的配置信息:
名稱:baiducors(可以隨便寫 我這邊用的百度人臉識別接口)
匹配URL
請求的URL(與模式匹配)
使用:通配符 或者 正則表達式 看具體需要
模式:*baiduApi/* (備注:這里可以點擊測試模式 自己看看重定向的地址是否正確)
條件:無
服務器變量:無
操作:重寫
操作屬性:https://aip.baidubce.com/{R:2}
附加查詢字符串:打勾
停止處理后續規則:打勾
五、重新啟動下IIS,至此反向代理設置完事
補充:針對跨域設置,iis還可以單獨設置
HTTP響應
找到網站,打開HTTP響應標頭設置
| Access-Control-Allow-Headers | Content-Type,api_key,Authorization |
| Access-Control-Allow-Methods | GET,POST,PUT,DELETE,OPTIONS |
| Access-Control-Allow-Origin | * |
其中
Access-Control-Allow-Headers表示請求消息頭;
Access-Control-Allow-Methods表示請求方法;
Access-Control-Allow-Origin表示請求來源,“*”表示不限定
六、拓展
項目在實際使用過一段時間后,發現通過iis設置的跨域設置不是很穩定,頻繁多次訪問,會請求失敗或者耗時時間比較長,在Vue的項目中調用第三方接口,比如獲取定位與逆地址解析等,很影響使用,因此更換了方式,在vue中使用jsonp的方式解決跨域。
1、安裝 vue-jsonp
npm install vue-jsonp --save
2、在main.js中引入
import { VueJsonp } from 'vue-jsonp'
Vue.use(VueJsonp)
3、示例調用的api
new Promise((resolve, reject) => {
console.log("逆地址解析開始");
var geocoderUrl = "https://apis.map.qq.com/ws/geocoder/v1";
console.log("逆地址解析請求地址:"+geocoderUrl);
_this.$jsonp(geocoderUrl,{
key:_this.mapkey,
location:coordinates,
output: "jsonp"
})
.then(res => {
console.log(res);
resolve(res);
})
.catch((err) => {
reject(err);
})
}).then(data => {
if(data.status!=0){
obj.success = false;
obj.msg = data.message;
!!Callback && Callback(obj);
}
obj.result = data.result;
!!Callback && Callback(obj);
}).catch(error => {
console.log(error);
_this.$messagebox.alert('逆地址解析失敗!'+ JSON.stringify(error));
obj.success = false;
!!Callback && Callback(obj);
});
需要注意的是,因為引入了vue-jsonp,所以可以直接使用this.$jsonp, Vue.use(VueJsonp)方法里把$jsonp賦給vue原型了:Vue.prototype.$jsonp = jsonp
即output: "jsonp"是必須的,
接口中需要加入 output 參數來告訴騰訊地圖訪問請求為 jsonp ;
