我们在实际开发项目的时候,经常会拆分项目或多个项目组合使用,那么就会出现跨域请求。
那什么是跨域请求?
在 HTML 中,<a>,<form>,<img>,<script>,<iframe>,<link>等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
举个例子:假如一个域名为aaa.cn的网站,它发起一个资源路径为aaa.cn/books/getBookInfo的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为bbb.com/pay/purchase的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。
跨域请求的安全问题
通常,浏览器会对上面提到的跨域请求作出限制。浏览器之所以要对跨域请求作出限制,是出于安全方面的考虑,因为跨域请求有可能被不法分子利用来发动 CSRF攻击。详细请看这篇:浅谈CSRF攻击方式。
那么本文重点是介绍如果使用nginx 的反向代理解决跨域问题。
nginx 是什么、怎么安装,请自行百度。
先上代码:
server{
listen 8889;
server_name localhost;
location / {
index index.html index.htm index.php;
root D:\\lgc\\docker-images\\nginx\\data\\html\\images\\terpc;
}
location ^~/terminal/ {
include uwsgi_params;
proxy_pass http://192.168.1.45:9103/;
}
location ^~/res/ {
proxy_pass http://192.168.1.45:9103;
}
access_log D:\\software\\nginx-1.10.3\\logs\\terpc.log;
}
重点看这部分:
首先配置了一个默认路径,指向静态页面的路径。然后配置一个反向代理,以“terminal”开头的请求会转发到“http://192.168.1.45:9103/”下,举个例子:
访问: http://192.168.1.45:8889/terminal/index.html ----实际指向跳转--> http://192.168.1.45:9103/index.html
上面配置注意一点:如果你配置的路径是 “ http://192.168.1.45:9103” 少了“/”,实际是指向的是“ http://192.168.1.45:9103/terminal/index.html ”
如何解决指向路径的静态资源访问404问题?
增加一个配置:
location ^~/res/ {
proxy_pass http://192.168.1.45:9103;
}
这个配置的意思是,http://192.168.1.45:8889/res ----> 开头的就指向 http://192.168.1.45:9103/res