在前端工作中,有时候会碰到跨域的问题,就是请求的接口地址和本身的服务器不属于一个域内,此时浏览器会报错:
XXXXX(请求的跨域url)has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested
网上有很多的解决办法,可以用jsonp来请求等等。
这里可以用nginx的转发功能来实现。
比如我这里axios请求的接口是
http://xxxx.xxxx.com/abc/efg/hi?12341234324
我用了axios的get方法直接请求了这个连接,不出意外的浏览器报错。
此时我在nginx里配置了这样一条
location /abc/efg/ {
proxy_pass http://xxxx.xxxx.com;
}
代码请求的连接直接改为
/abc/efg/hi?1234234242432
此时去掉了前面的域名,实际上请求的是我本地的地址:
127.0.0.1:端口号/abc/efg/hi?123121313
然后nginx碰到了
/abc/efg/
所以自动的捕捉匹配这个端口的地址,转到了
http://xxxx.xxxx.com/abc/efg/hi?12341234324
可以实现的原因在于,出现了跨域问题是浏览器的报错,只要后台处理一下,用nginx转发就可以轻松的解决问题。
注意:我在配置了nginx后,实际测试时没有生效,一度以为自己配的有问题,后来发现时我自己的电脑问题,事实证明,觉得配的没问题还一直折腾的时候,那就是电脑问题了,可以换服务器上试一试。nginx经常不生效的,感觉windows上的nginx不靠谱,建议不确定的时候可以把跳转连接换成www.baidu.com来实验一下。我本地测试的时候百度跳转都没生效,有时候怀疑电脑有问题可能是正确的。
我是第二弹分割线
第二弹:
在解决了跨域问题后,又出现了一个老大难的问题:如何解决https请求的问题。
当上文的nginx放在生产环境时,请求对方的连接变成了
https://xxxx.xxxx.com/abc/efg/hi?12341234324
然后在重启nginx的时候,无法启动nginx,我本身的服务器是http的,对方是https,启动的时候报错
https protocol requires SSL support
1.单纯的只是我方nginx安装的时候没有装ssl模块,解决方式参考连接
https://www.cnblogs.com/piscesLoveCc/p/6120875.html
2.在nginx配置里不需要放上监听443端口的内容,配置证书跟密钥
listen 443 ssl;
ssl_certificate /usr/local/Tengine/sslcrt/ wosign.com.crt;
ssl_certificate_key /usr/local/Tengine/sslcrt/ wosign.com .Key;
就是这些东西,只是我们请求别人的接口,不需要配置证书跟密钥。除非是我方自己是https的时候,才需要监听端口和配置自己的证书跟密钥。