前言

我是一个小前端,前段时间开始支持集团监控平台业务。
当我拉下代码,开启本地服务,出现了一大堆请求错误。
原因是:本地的host是127.0.0.1,而接口调用的是线上数据
接口的host和平台url的host都是x.alibaba-inc.com。
怎么办?我要跨域。。
直接修改hosts是不行的,使用http的withCredentials为真,导致允许跨域的源必须是本地,会导致监控平台对外提供的接口出现问题。
。。。
然后我请教了@绘萌师兄,师兄提出可以把线上资源代理到本地。
OK,怎么把线上资源代理到本地呢?
经过一番折腾,我总结出如下四种方式。

方式

1、抓包类工具

常用的抓包工具有Wireshark、Fiddler、Charles。
这里我拿Charles举例子,把线上资源代理到本地叫本地文件映射。
菜单路径:Tools -> Map Local
与本地文件映射对应的叫远程映射文件映射,远程映射文件映射将路径映射到其他服务器上,而本地映射则映射到本地磁盘上。

Map From 设置好线上文件 A 的相关信息,Map To 里选择本地资源,请求文件 A 时,就会返回指定的本地文件。
图中我把日常前端所有资源都代理到本地了。

2、浏览器插件

Chrome的相关插件:Proxy SwitchySharp、ReRes
Firefox的相关插件:FoxyProxy、Autoproxy

试一把:

本地修改代码,发现线上完全同步了,完美!

传送门:
Proxy SwitchySharp
ReRes
FoxyProxy
Autoproxy

3、Nginx

原理:使用nginx反向代理,起localhost的http服务,本地代理层拦截静态资源请求,并返回本地的静态资源;放过数据请求,将数据请求代理成线上真实的地址。
首先,要理清楚前端的静态资源请求和数据请求。然后对nginx.conf进行配置。到这一步,我们已经能接触到线上,但是线上访问有跨域限制,所以需要绑定host,使得到线上的请求的不受跨域限制。

配置文件内容如下:

user root;
worker_processes  4;pid        logs/nginx.pid;events {worker_connections  1024;
}http {include       mime.types;default_type  application/octet-stream;sendfile        on;keepalive_timeout  65;server {listen       80;server_name  x.alibaba-inc.com;# 拦截并返回本地的静态资源location ~ ^/modules.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {# 拦截并返回本地的静态资源root /Users/feiyu/Documents/xflush/xflush-burning/app;}  location ~ ^/bower_components.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {root /Users/feiyu/Documents/xflush/xflush-burning;} location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {root /Users/feiyu/Documents/xflush/xflush-burning/app;} # 放过的数据请求,该资源为服务器端提供location = /env.js {proxy_pass http://100.67.99.11;}# 放过的数据请求,该资源为服务器端提供location = /tenants.js {proxy_pass http://100.67.99.11;}# 放过的数据请求,此处为ajax请求的数据location / {proxy_pass http://100.67.99.11;}}}

4、Nodejs

完成该项功能的是 http-proxy 包。下载、安装请键入:

    npm install http-proxy  

在使用这个之前要做的是对请求类型的一些判断,即请求Js/css/jpg等这些文件时,返回的response信息类型是什么,于是有了下面的代码:

var getContentType = function(ext){var contentType = '';switch(ext){case ".html":contentType= "text/html";break;case ".js":contentType="text/javascript";break;case ".css":contentType="text/css";break;case ".gif":contentType="image/gif";break;case ".jpg":contentType="image/jpeg";break;case ".png":contentType="image/png";break;case ".ico":contentType="image/icon";break;default:contentType="application/octet-stream";}return contentType;
};

接着是代理代码:

/*http-proxy
*/
var http = require('http'),httpProxy = require('http-proxy')  //http-proxy,proxy = httpProxy.createProxyServer({}),fs = require('fs'),path = require('path'),getConType = require('./content-type')//自己定义  根据后缀转换Content-Type
;var server = http.createServer(function(req, res) {var _url = req.url //获取请求的url,_file,_localPath,_localFile,_ext,_stream ;//eg://g-assets.daily.taobao.net/ais-fed/sunfire/1.0.0/vendor.jsif(_url.indexOf('//g-assets.daily.taobao.net/ais-fed/sunfire/1.0.0/')>-1){_ext = path.extname(_file); // 文件扩展//vendor.js_file = _url.replace('//g-assets.daily.taobao.net/ais-fed/sunfire/1.0.0/','');//转换成本地路径_localPath = '/Users/feiyu/Documents/xflush/sunfire/build/';_localFile = _localPath+_file;//判断文件是否存在if(fs.existsSync(_localFile)){//如果文件存在res.writeHead(200, {"Content-Type": getConType(_ext) });_stream = fs.createReadStream(_localFile, {flags : "r", encoding : null});//只读模式 读取文件内容_stream.on('error',function(){//如果读取错误 返回404res.writeHead(404, {"Content-Type": "text/html"});res.end("<h1>404 Read Error</h1>");});_stream.pipe(res);//连接文件流和http返回流的管道,用于返回实际Web内容_stream.on('end',function(){_stream = null;})}else{//返回404错误res.writeHead(404, {"Content-Type": "text/html"});res.end("<h1>404 Not Found</h1>");}}else{proxy.web(req, res, { target: 'x.alibaba-inc.com' });}});console.log("listening on port 80")
server.listen(80);

总结来说,实现反向代理的静态资源分离,首先是判断request来判断是否请求静态文件,如果是请求静态文件,就找到项目下的具体文件,直接用fs读取,如果不是请求静态文件那么就用proxy.web来请求实际服务器。最后别忘了绑定host。

另外给一个anyproxy的传送门,它是用nodejs写的,提供web版界面,可以观测请求情况,还具有开放接口,允许用户进行充分的自定义。

anyproxy

总结

其实都是为了解决问题,只是方式不同,大家爱用哪个用哪个哈~

最后,我想感谢@谷童@季真@笑斌三位同学!
谷童做为最初的引导老师;
季真教我如何配置nginx;
笑斌帮我review nodejs代码。

线上前端静态资源代理到本地的几种方式相关推荐

  1. 使用MITM调试线上前端错误

    使用MITM调试线上前端错误 前言 目前所在的公司每次部署上线至少半小时,如果在上线刚完成,检查线上发现有bug时,这意味着你又要等一次部署,尤其是接近下班的时候出这事的话,整个人都不好了. 首先线上 ...

  2. springboot自定义静态资源代理WebMvcConfigurerAdapter详解和过期后的替代方案WebMvcConfigurer

    最常用的跨域和静态资源代理 import org.springframework.context.annotation.Configuration; import org.springframewor ...

  3. python 后端接受前端传到后端的数据的四种方式

    python 后端接收前端传到后端的数据的4种方式 1,以查询字符串的方式传入 def test(request): #查询字符串方式传参的获取a = request.GET.get('a') #a为 ...

  4. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  5. python怎么下载图片怎么保存到本地_详解Python下载图片并保存本地的两种方式

    一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码: import os,stat import urllib.request img_url ...

  6. 前端遇上Go: 静态资源增量更新的新实践

    为什么要做增量更新 美团金融的业务在过去的一段时间里发展非常快速.在业务增长的同时,我们也注意到,很多用户的支付环境,其实是在弱网环境中的. 大家知道,前端能够服务用户的前提是 JavaScript ...

  7. 前端静态资源缓存最优解以及max-age的陷阱

    原文地址:点这里 合理的使用缓存可以极大地提高网站资源的利用率,还可以节约带宽从而降低服务器成本.但是很多站点针对缓存的策略并不合理,甚至是完全无作为,如果是这样,就完全没有发挥出缓存的优势,而不合理 ...

  8. 通过Fiddler实现部分静态资源代理

    需求:本地操作,替换浏览器解析的静态资源 功能:1.实现静态资源的调试 2.实现部分静态资源的网络代理(将原本需要访问特定url的资源,改为自定义的url地址) 操作步骤 1.选择需要替换的静态资源 ...

  9. 前端静态资源请求和加载优化总结

    如果有这样一个项目,js脚本数量100+,其中50个是各种框架或库,css数量20+,图片若干 .那么,不用说,这个页面加载起来,一定快不了. 静态资源的请求和加载速度,直接影响页面呈现,应该怎么优化 ...

最新文章

  1. 经典语录【摘自网路】
  2. 为什么微信内无法分享转发网址,详谈微信网址防屏蔽的办法
  3. BZOJ4855 : [Jsoi2016]轻重路径
  4. 如何把python文件发给别人没_如何把自己写的python程序给别人用
  5. php 表格分页代码,[Php]分页及表格样式
  6. disable path length limit_通过Antsword看绕过disable_functions
  7. 前端关系图谱插件_智游告诉你,前端开发应该学什么?
  8. 小蚂蚁学习数据结构(16)——串的堆分配储存代码演示
  9. Front End Developer Questions 前端开发人员问题(二)
  10. HTML5:web socket 和 web worker
  11. sysdig_Linux 监控和调试利器 Sysdig 入门教程
  12. oracle 高速保存数据,教你怎样在Oracle数据库中高速导出/导入(一)
  13. win10系统文件夹黑色的背景色如何更改为白色?
  14. coturn NAT穿透服务器搭建
  15. 使用HttpClient登录知乎获取返回页面信息
  16. 磁波刀和海扶刀的区别
  17. teambition/tower/team@osc/worktile团队协作工具价格比较
  18. Java到底能干什么?
  19. BetterGeo Mod 中文
  20. openh264编解码器的编译与运行

热门文章

  1. 各种计算机编程语言之父
  2. 指数函数exp(x)相关
  3. 两台Linux完美实现双机热备
  4. WCF实现全双工通信笔记
  5. 智慧工厂和数字化车间的区别、联系是什么?
  6. TikTok云控功能说明
  7. 金蝶K3 14.0 泛微OA10.0 注册机 学习沟通
  8. linux配置can驱动
  9. Neo4j资料 Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程
  10. postgresql数据库 TimescaleDB 定时压缩超表 删除超表(块)