当前位置:   article > 正文

前端如何通过Nginx代理做到跨域访问API接口

nginx代理api 另一个代理地址也有api
跨域是指a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,或是a页面为ip地址,b页面为域名地址,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源
Nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上。通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问。对于浏览器来说,访问的就是同源服务器上的一个url。而nginx通过检测url前缀,把http请求转发到后面真实的物理服务器

一.配置Nginx

废话不多说,我们直接打开nginx.conf文件

  1. server {
  2. listen 8888;
  3. server_name 127.0.0.1;
  4. location / {
  5. if ($request_method ~* "(GET|POST)") {
  6. add_header "Access-Control-Allow-Origin" *;
  7. }
  8. # Preflighted requests
  9. if ($request_method = OPTIONS ) {
  10. add_header "Access-Control-Allow-Origin" *;
  11. add_header "Access-Control-Allow-Methods" "GET, POST, OPTIONS, HEAD";
  12. add_header "Access-Control-Allow-Headers" "Authorization, Origin, X-Requested-With, Content-Type, Accept";
  13. return 200;
  14. }
  15. proxy_pass http://127.0.0.1:5500;
  16. proxy_redirect default;
  17. }
  18. location /api{
  19. rewrite ^/api/(.*)$ /$1 break;
  20. proxy_pass http://ip.taobao.com/;
  21. }
  22. }

配置解释:

我们在浏览器中输入 127.0.0.1:8888 自动会转发到 http://127.0.0.1:5500

http://127.0.0.1:5500 是本地所指向的地址,类似于vue开的的代理npm run dev 启动的一个地址,你也阔以不用code开启的代理,直接用nginx启动一个开发端口,把上面的 location / 替换掉

  1. location / {
  2. #指向文件的目录
  3. root D:\qianlima\weijia\weijia;
  4. #指定项目页面名称
  5. index index.html index.htm;
  6. }

http://ip.taobao.com/ 是我们要访问的接口地址(淘宝检测ip地址来源的接口)

rewrite ^/apis/(.)$ /$1 break:代表重写拦截进来的请求,并且只能对域名后边以“/apis”开头的起作用,例如www.a.com/apis/msg?x=1重写。只对/apis重写。rewrite后面的参数是一个简单的正则 ^/apis/(.)$ ,$1代表正则中的第一个(),$2代表第二个()的值,以此类推,break代表匹配一个之后停止匹配。

前端ajax的url地址 这样写 http://127.0.0.1:8888/api/service/getIpInfo.php?ip=117.89.35.51,访问的url中有api nginx会自动换到所对应的location


前端实列代码:

  1. //新建一个html文件把以下代码放入script标签中
  2. $.ajax({
  3. //请求淘宝检测ip地址来源的接口
  4. url:'http://127.0.0.1:8888/api/service/getIpInfo.php?ip=117.89.35.51',
  5. type:'get',
  6. success:function(res){
  7. console.log(res)
  8. },
  9. error:function(err){
  10. console.log(err)
  11. }
  12. })

启动服务:

我是通过vsCode的Go live插件启动了一个127.0.0.1:5500的服务,有很多同学是通过node开启的代理,都一样,
然后我们在浏览器中输入127.0.0.1:8888上面nginx所配置

打开浏览器network数据返回如下,说明跨域访问成功
clipboard.png

附带完整实列代码
来自国外一篇文章Nginx启用CORS,配置的非常完整,需要翻墙

  1. location / {
  2. if ($request_method = 'OPTIONS') {
  3. add_header 'Access-Control-Allow-Origin' '*';
  4. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  5. #
  6. # Custom headers and headers various browsers *should* be OK with but aren't
  7. #
  8. add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
  9. #
  10. # Tell client that this pre-flight info is valid for 20 days
  11. #
  12. add_header 'Access-Control-Max-Age' 1728000;
  13. add_header 'Content-Type' 'text/plain; charset=utf-8';
  14. add_header 'Content-Length' 0;
  15. return 204;
  16. }
  17. if ($request_method = 'POST') {
  18. add_header 'Access-Control-Allow-Origin' '*';
  19. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  20. add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
  21. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
  22. }
  23. if ($request_method = 'GET') {
  24. add_header 'Access-Control-Allow-Origin' '*';
  25. add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
  26. add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
  27. add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
  28. }
  29. }

二.其它跨域解决方案

1.jsonp 需要目标服务器配合一个callback函数。

2.window.name+iframe 需要目标服务器响应window.name。

3.html5的 postMessage+ifrme 这个也是需要目标服务器或者说是目标页面写一个postMessage,主要侧重于前端通讯。

4.node.js开启本地代理,类似于vue-cli中的devServer模式,阔以方便开启代理

5.CORS 需要服务器设置header :Access-Control-Allow-Origin。

6.Nginx反向代理,可以不用目标服务器配合,需要Nginx服务器,用于请求转发。

我个人认为4 、5 、6解决跨域问题在实际开发过程中显得更为重要

三.Nginx工具以及参考资料

Nginx在线配置生成工具(需要翻墙)
如何提高Nginx的性能
Nginx常用命令
Nginx 配置简述(小胡子哥)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/232353
推荐阅读
相关标签
  

闽ICP备14008679号