线上前端静态资源代理到本地的几种方式
前言
我是一个小前端,前段时间开始支持集团监控平台业务。
当我拉下代码,开启本地服务,出现了一大堆请求错误。
原因是:本地的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代码。
线上前端静态资源代理到本地的几种方式相关推荐
- 使用MITM调试线上前端错误
使用MITM调试线上前端错误 前言 目前所在的公司每次部署上线至少半小时,如果在上线刚完成,检查线上发现有bug时,这意味着你又要等一次部署,尤其是接近下班的时候出这事的话,整个人都不好了. 首先线上 ...
- springboot自定义静态资源代理WebMvcConfigurerAdapter详解和过期后的替代方案WebMvcConfigurer
最常用的跨域和静态资源代理 import org.springframework.context.annotation.Configuration; import org.springframewor ...
- python 后端接受前端传到后端的数据的四种方式
python 后端接收前端传到后端的数据的4种方式 1,以查询字符串的方式传入 def test(request): #查询字符串方式传参的获取a = request.GET.get('a') #a为 ...
- 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式
安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...
- python怎么下载图片怎么保存到本地_详解Python下载图片并保存本地的两种方式
一:使用Python中的urllib类中的urlretrieve()函数,直接从网上下载资源到本地,具体代码: import os,stat import urllib.request img_url ...
- 前端遇上Go: 静态资源增量更新的新实践
为什么要做增量更新 美团金融的业务在过去的一段时间里发展非常快速.在业务增长的同时,我们也注意到,很多用户的支付环境,其实是在弱网环境中的. 大家知道,前端能够服务用户的前提是 JavaScript ...
- 前端静态资源缓存最优解以及max-age的陷阱
原文地址:点这里 合理的使用缓存可以极大地提高网站资源的利用率,还可以节约带宽从而降低服务器成本.但是很多站点针对缓存的策略并不合理,甚至是完全无作为,如果是这样,就完全没有发挥出缓存的优势,而不合理 ...
- 通过Fiddler实现部分静态资源代理
需求:本地操作,替换浏览器解析的静态资源 功能:1.实现静态资源的调试 2.实现部分静态资源的网络代理(将原本需要访问特定url的资源,改为自定义的url地址) 操作步骤 1.选择需要替换的静态资源 ...
- 前端静态资源请求和加载优化总结
如果有这样一个项目,js脚本数量100+,其中50个是各种框架或库,css数量20+,图片若干 .那么,不用说,这个页面加载起来,一定快不了. 静态资源的请求和加载速度,直接影响页面呈现,应该怎么优化 ...
最新文章
- 经典语录【摘自网路】
- 为什么微信内无法分享转发网址,详谈微信网址防屏蔽的办法
- BZOJ4855 : [Jsoi2016]轻重路径
- 如何把python文件发给别人没_如何把自己写的python程序给别人用
- php 表格分页代码,[Php]分页及表格样式
- disable path length limit_通过Antsword看绕过disable_functions
- 前端关系图谱插件_智游告诉你,前端开发应该学什么?
- 小蚂蚁学习数据结构(16)——串的堆分配储存代码演示
- Front End Developer Questions 前端开发人员问题(二)
- HTML5:web socket 和 web worker
- sysdig_Linux 监控和调试利器 Sysdig 入门教程
- oracle 高速保存数据,教你怎样在Oracle数据库中高速导出/导入(一)
- win10系统文件夹黑色的背景色如何更改为白色?
- coturn NAT穿透服务器搭建
- 使用HttpClient登录知乎获取返回页面信息
- 磁波刀和海扶刀的区别
- teambition/tower/team@osc/worktile团队协作工具价格比较
- Java到底能干什么?
- BetterGeo Mod 中文
- openh264编解码器的编译与运行