在 Web 应用中,跨域是程序猿绕不过去的坎。
什么是跨域:
当一个请求 url 的协议、域名、端口三者之间任意一个与当前页面 url 不同即为跨域。
举例:在自己的应用 html 中,需要访问微信或者新浪接口,这时浏览器就会提示跨域了。如下代码所示:在业务代码中访问网络地址来查询天气信息。
let url = 'http://t.weather.sojson.com/api/weather/city/101030100'
axios
.get(url)
.then(resp => {
console.log('result:' + resp.data)
this.content = resp.data
alert('request success!')
})
.catch(e => {
console.log('exception:' + e)
alert('request failed!')
})
为什么会跨域:
出于浏览器的同源策略限制。同源策略(SameOriginPolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的 javascript 脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。
let url = '/api/weather/city/101030100'
axios
.get(url)
.then(resp => {
console.log('result:' + resp.data)
this.content = resp.data
alert('request success!')
})
.catch(e => {
console.log('exception:' + e)
alert('request failed!')
})
在 webpack.config.js 中代码如下:
devServer: { //开发模式下使用的配置参数
proxy: {
'/api': {
target: 'http://t.weather.sojson.com', // 接口域名
changeOrigin: true, //是否跨域
pathRewrite: {
'^/api': '/api' //需要rewrite的,
}
}
}
}
const urlConfig = {
baseUrl: '',
apiUrl: ''
}
{
from: __dirname + "/src/config", //源目录
to: "./config", //目标目录
};
<script type="text/javascript" src="config/url.js">script>
注意:上述 src 中的路径是以 webpack.config.js 中配置的相对路径关系而定。
Vue.prototype.url = urlConfig
let url = this.url.apiUrl + '/api/weather/city/101030100'
这个第三方 url 为随意举例,只是告诉大家可以这样剥离所有的 url。实际上步骤 3 中的业务场景举例才是剥离 url 的主要原因。也就是说 baseUrl 抽出来的意义更大。baseUrl 的使用方法和上述 apiUrl 的使用方法相同。
brew install nginx
listen 80;
server_name 127.0.0.1;
charset utf-8;
location / {
proxy_pass http://127.0.0.1:8080;
}
location /api {
proxy_pass http://t.weather.sojson.com/api;
}
保存完毕后,执行 nginx 启动命令:
nginx -c /usr/local/etc/nginx/nginx.conf
let url = '/api/weather/city/101030100'
axios
.get(url)
.then(resp => {
console.log('result:' + resp.data)
this.content = resp.data
alert('request success!')
})
.catch(e => {
console.log('exception:' + e)
alert('request failed!')
})
[1]什么是跨域?跨域解决方法