【Node】node.js实现服务器的反向代理,解决跨域问题
跨域对于前端来说是一个老大难的问题,许多方法如jsonp、document.domain + iframe...都有或多或少的问题,一个最佳实践就是通过服务器nginx做反向代理,但奈何不懂相关知识,就一直琢磨着使用 node.js来做。
3月28更新:
在实现完功能后,我考虑将它做成一个可供任意项目调用的模块,简化其使用方法,预想的调用方式为:
**start.js**
````
const webProxy = require('./webProxy').webProxy
webProxy(targetUrl, localPort)
````
在CMD中切换到文件所在地址,键入:node start.js开启服务
下载地址:这里
配置http服务器和 http-proxy 转发请求
const http = require('http'),
httpProxy = require('http-proxy'),
fs = require('fs'),
url = require('url'),
path = require('path'),
mime = require('./mime').types;
let proxy = httpProxy.createProxyServer({
target: 'http://192.168.1.30:6760',
secure: false
})
proxy.on('error', function (err, request, response) {
res.writeHead(500, {
'Content-Type': 'text/plain'
})
console.log(err)
res.end('Something went wrong.')
})
let server = http.createServer((request, response)=> {
var pathName = url.parse(request.url).pathname;
var realPath = request.url.substring(1);
var extName = realPath;
var indexOfQuestionMark = extName.indexOf('?');
if(indexOfQuestionMark >= 0){
extName = extName.substring(0, indexOfQuestionMark);
realPath = realPath.substring(0, indexOfQuestionMark);
}
extName = path.extname(extName);
extName = extName ? extName.slice(1) : 'unknown';
if(/\/api\/.*$/.test(pathName)){
proxy.web(request, response);
return;
}
if(!fs.existsSync(realPath)){
response.writeHead(404, {'content-type': 'text/plain'});
response.write('The request URL:' + realPath + ' could not be found.');
response.end();
return;
}
fs.readFile(realPath, 'binary', function(err, file){
if(err){
response.writeHead(500, {'content-type': 'text/plain'});
response.end(err);
return;
}
var contentType = mime[extName] || 'text/plain';
response.writeHead(200, {'content-type': contentType});
response.write(file, 'binary');
response.end();
});
});
console.log('listening on port 9060')
server.listen(9060);
mime.js
exports.types = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml",
"woff": "application/x-woff",
"woff2": "application/x-woff2",
"tff": "application/x-font-truetype",
"otf": "application/x-font-opentype",
"eot": "application/vnd.ms-fontobject"
};
项目工程结构如图

配置说明
基于node.js实现服务器的反向代理,核心步骤分为:
- 通过
http模块搭建本地服务器,使用fs模块读取本地.html、.js、.css等文件; - 使用
http-proxy插件完成代理,基本用法可以在这里找到。 - 通过 pathname 找到用于发送ajax 请求的api 地址,拦截请求,通过
http-proxy模块转发。
````
if(/\/api\/.*$/.test(pathName)){
proxy.web(request, response);
return;
}
````
- 当链接如右所示:
http://localhost:9060/view/index.html?id=5,拿到的扩展名(变量extname)会有bug,所以这里先去掉了"?"后面的数据。
````
var indexOfQuestionMark = extName.indexOf('?');
if(indexOfQuestionMark >= 0){
extName = extName.substring(0, indexOfQuestionMark);
realPath = realPath.substring(0, indexOfQuestionMark);
}
````
其他
通过 node.js内置的服务器和第三方插件,我们完成了反向代理服务器,在其他文件不进行任何改动的情况下完成了跨域请求。但同时,又有了新的思考:
1、 每次启动服务都要键入node proxy.js, 非常麻烦,有没有简便方法?
2、 是否可以和gulp等构建工具配合使用?
3、 如何使用vue 之类的框架?
留待优化......
文章部分引用:
http://www.cnblogs.com/shawn-xie/archive/2013/06/06/3121173.html
https://segmentfault.com/a/1190000005101903
感谢!!!
【Node】node.js实现服务器的反向代理,解决跨域问题的更多相关文章
- windows环境下 nginx+iis 反向代理解决跨域问题
项目基本完成,是时候花点时间整理一下最近的姿势了 1 什么是跨域? 网上对于跨域的概念会有大篇幅的文章去解释,似乎有点玄乎,初学者很容易对这个概念产生恐惧,跨域其实很简单,其实只要知道一点,无法跨域访 ...
- nginx反向代理解决跨域问题
跨域:浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 下表格为前后端分离的域名,技术信息: 域名 服务器 使用技术 前端 http://b.yynf.com ...
- 前端通过Nginx反向代理解决跨域问题
在前面写的一篇文章SpringMVC 跨域,我们探讨了什么是跨域问题以及SpringMVC怎么解决跨域问题,解决方式主要有如下三种方式: JSONP CORS WebSocket 可是这几种方式都是基 ...
- 利用nginx 反向代理解决跨域问题
说到nginx,不得不说真的很强大,也带来很多便利用于解决一些头疼的难题. 一般来说可以用来做:静态页面的服务器.静态文件缓存服务器.网站反向代理.负载均衡服务器等等,而且实现这一切,基本只需要改改那 ...
- nginx反向代理解决跨域
nginx作为反向代理服务器,就是把http请求转发到另一个或者一些服务器上.通过把本地一个url前缀映射到要跨域访问的web服务器上,就可以实现跨域访问.对于浏览器来说,访问的就是同源服务器上的一个 ...
- Nginx 反向代理解决跨域问题分析
当你遇到跨域问题,不要立刻就选择复制去尝试.请详细看完这篇文章再处理 .我相信它能帮到你. 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://local ...
- webpack-dev-server 设置反向代理解决跨域问题
一.设置代理的原因 现在对前端开发的要求越来越高,并且随着自动化以及模块化的 诞生,前后端开发模式越来越流行.后端只负责接口,前端负责数据展示.逻辑处理.但是前后端开发模式,有一个重要的问题,就是跨域 ...
- nginx反向代理解决跨域问题,使本地调试更方便
我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...
- vue反向代理解决跨域
问题描述 在项目开发的时候,接口联调的时候一般都是同域名下,且不存在跨域的情况下进行接口联调,但是当我们现在使用vue-cli进行项目打包的时候,我们在本地启动服务器后,比如本地开发服务下是 http ...
- wamp2.4.4 如何配置虚拟主机及反向代理(解决跨域问题)
一.找到安装目录下的httpd.conf文件 1. 删除Include conf/extra/httpd-vhosts.conf前面的#号(开启虚拟主机的配置) 2. 删除LoadModule pro ...
随机推荐
- 新手C#构造函数、继承、组合的学习2018.08.06/07
构造函数,是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同 ...
- jsp中常用的标签
jsp本质上就是一个servlet,只是tomcat会将其翻译成servlet,servlet本质上是一个类,那么jsp也是一个类.jsp中各种标签都会被tomcat翻译成各种基本的java代码 如果 ...
- 130. Surrounded Regions (Graph; DFS)
Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...
- ORA-01795: maximum number of expressions in a list is 1000
今天发现查询Oracle用In查询In的元素不可以超过1000个还需要分成多个1000查询记录博客备忘!! Load Test的时候发现这么如下这个错误.... ORA-01795: maximum ...
- 打劫房屋 · House Robber
[抄题]: 假设你是一个专业的窃贼,准备沿着一条街打劫房屋.每个房子都存放着特定金额的钱.你面临的唯一约束条件是:相邻的房子装着相互联系的防盗系统,且 当相邻的两个房子同一天被打劫时,该系统会自动报警 ...
- HTML 页面中的 SVG
SVG 文件可通过以下标签嵌入 HTML 文档:<embed>.<object> 或者 <iframe>. 1>使用 <embed> 标签 < ...
- Python里seed()函数
seed()函数的功功能是每次改变随机数生成器的种子,会改变下一次随机数模块生成的随机数.seed()方法在每次调用随机函数之前使用. 如果种子不变,那么随机函数生成的随机数相同,例如: #!/usr ...
- SpringCloud之自动化配置-config
编程开发的时候有没有觉得很多配置文件需要维护,比如,修改了数据库连接,所有用到该数据库的服务配置都得替换,是不是超级的麻烦呢 下面,给大家介绍一下Spring提供的配置自动化组件-spring clo ...
- java.sql.SQLException: Access denied for user ''@'localhost' (using password: YES)
这个问题是说明你的JDBC数据库连接位置出错了,请仔细检查 private static String url; private static String username; private sta ...
- UVa 11136 Hoax or what (STL)
题意:有 n 天,每天有m个数,开始的前一天没有数据,然后每天从这个里面拿出一个最大的和最小的,求 n 天的最大的和最小的差值相加. 析:一看就知道用set啊,多简单的STL,不过要注意,开long ...