用nodejs搭建代理服务器
题图 From 极客时间 From Clm
前端开发者在工作中常常遇到跨域的问题,一般我们遇到跨域问题主要使用以下办法来解决:
1、jsonp
2、cors
3、配置代理服务器。
jsonp不是很灵活,只能发送get请求,不能发送psot请求,而cors虽然可以支持多种请求格式,但是如果请求携带cookie的话,还需要服务端和客户端分别配置一下,个人感觉也很麻烦。
相对于前两种,使用代理服务器解决跨域问题就简单了好多。
浏览器由于同源策略的原因,不同域名之间发送ajax请求,响应的数据不会被浏览器加载。而服务器向服务器发送请求则没有同源策略的限制。
下图便是代理服务器的原理了:
代理服务器只是起一个中转作用,配置代理服务器的方法有很多种,比如利用apache、nginx、tomcat等等,今天给大家介绍的是用nodejs配置代理服务器,用nodejs配置代理服务器,我们需要借助两个npm包,一个是web开发框架express,一个是express中间件http-proxy-middleware 。
首先第一步我们先用express搭建两个服务器,一个静态资源服务器端口号为3000,一个接口服务器端口号为5000,静态资源服务器代码如下:
var express = require('express');
var app = express();
app.use(express.static('./public'));
app.listen(3000);
并且在public文件夹下新建a.html,并且在页面中使用jquery,使用jquery发送ajax向接口服务器发送测试请求。
a.html代码如下:
接着搭建接口服务器,接口服务器端口号为5000,代码如下:
观察代码,我们设计了三个接口,都是get请求,只是url不同。
此时启动静态资源服务器和接口服务器,然后访问静态资源服务器下面的a.html,结果如图:
如图所示,发生跨域了,此时在静态资源服务器中安装http-proxy-middleware 中间件,并将其集成到静态资源服务器中。
代码如下:
此时重启静态资源服务器,并将啊,a.html页面中发送ajax的地址稍微改动一下,如图:
观察代码:我们代码原来是直接请求5000端口服务器的数据,现在将其改成相对路径,相对于当前网页所在的服务器,当前的网页所在的静态服务器端口为3000。
当我们访问:http://localhost:3000/a.html,结果如图:
看ajax请求的地址是如何拼接的:
得出结论:相对路径会被自动拼接。
再看请求的结果,成功了:
成功跨域了,当然这样说不严谨,浏览器并没有参与跨域,而是页面中的ajax请求的地址还是3000端口的服务,只不过是3000端口的服务接收到请求,将其转发给了5000端口的服务,并将5000端口的服务结果原封不动的返还给了浏览器。
回顾上面的代码,我们只是在静态资源服务器中应用了http-proxy-middleware中间件,这个中间件的使用非常简单,分为如下几步:
1、安装并引入到项目中。
2、通过app.use挂载中间件,这里需要注意的是,在挂载这个中间件的时候,app.use需要设置一个前置路由,和项目本来的路由作区分。
调用这个中间件的时候需要设置几个常用参数:
1、target,指的是目标网站,或者被代理的网站。
2、changeOrigin是否更改host。默认为false,不重写。
3、pathRewrite路径重写,这个特性看需求。
简单配置一下:
如果这样配置,当a.html中发送请求时,这样写:
这个请求会被静态资源服务器转化为:
http://localhost:5000/api/a
也就是说如果不设置pathRewrite的话,页面中的请求地址会被原封不动的追加到目标服务器地址的后面。
而如果真正的接口地址是这样的:
http://localhost:5000/b
代理服务器该如何配置呢?
此时在页面中发送求请:
此时根据代理服务的重写规则,最终请求的地址为:
http://localhost:5000/b
以上便是pathRewrite的作用。
接着看changeOrigin的作用,当我们将changeOrigin设置为true时,我们在接口服务器打印req.headers,看看结果如何:
仔细观察host是localhost:5000,而将changeOrigin改为false呢?再次打印req.headers:
此时查看host是localhost:3000,
changeOrigin就是是否重写请求头中的host,代理服务器会在请求头中加入相应Host首部,然后目标服务器就可以根据这个首部来区别要访问的站点了。假如你在本地80端口起了apache服务器,服务器配了两个虚拟站点a.com b.com,设置代理之后并且changeOrigin为true 。此时就可以正确方法访问到虚拟主机下的文档内容。否则访问a b站点等同于访问localhost。当然如果你的服务器没有配置虚拟主机,完全可以省略这个参数,就像上面演示的代码,完全可以省略这个参数。因为接口服务器并没有设置虚拟主机。
以上便是用nodejs搭建代理服务器的知识了,这个http-proxy-middleware中间件用的很广泛,在vue-cli或者create-react-app生成的项目中都内置了这个中间件,配置规则基本和上面相同,大家有问题可以留言。
每天进步一点点,大家共勉,虽然放假了,但是不能松懈呀。
代码地址 https://github.com/clm1100/corsAndProxy/tree/master/proxy
https://segmentfault.com/q/1010000005271156
https://segmentfault.com/q/1010000012607105
用nodejs搭建代理服务器的更多相关文章
- NodeJS搭建HTTPS服务器
		
[NodeJS搭建HTTPS服务器] http://cnodejs.org/topic/54745ac22804a0997d38b32d
 - 用nodejs搭建一个简单的服务器
		
使用nodejs搭建一个简单的服务器 nodejs优点:性能高(读写文件) 数据操作能力强 官网:www.nodejs.org 验证是否安装成功:cmd命令行中输入node -v 如果显示版本号表示安 ...
 - nodejs搭建http-server
		
很多时候我们都需要搭建一个简单的服务器,部署在IIS,阿帕奇,或者用nodejs,网上很多关于nodejs搭建server的文章,但都是要创建server.js,很麻烦, 在这里我分享一个创建ht ...
 - 用 xampp 在 windows/Linux 下搭建代理服务器
		
背景:学校上网开始收费,但实验室免费,由于宿舍和实验室都有ipv6,所以在实验室搭建代理服务器,让宿舍通过之上网. Windows下 两步: 1.编辑httpd.comf,去掉关于proxy的注释 L ...
 - 从零开始,在windows上用nodejs搭建一个静态文件服务器
		
从零开始,在windows上用nodejs搭建一个静态文件服务器 首先安装nodejs: 新建一个node文件夹 下载node.exe到该文件夹 下载npm然后解压到该文件夹 现在node文件夹是这样 ...
 - web前端效率提升-nginx+nodejs搭建本地生态
		
1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...
 - 用nodejs搭建类似于C++的服务器后台.类似网易pomelo
		
实际的情况,用nodejs跑业务,非常的快,只要用好其无阻塞和回调这两点,处理速度真的是杠杠的. 从年初开始,我用nodejs搭建了类似C++的服务器后台,也想和做同样的事情的朋友分享,本服务平台因为 ...
 - centos7.3使用squid搭建代理服务器
		
centos7.3使用squid搭建代理服务器 1 安装 yum install squid 2 编辑 vi /etc/squid/squid.conf 3 设置 最底部增加 如下http_acces ...
 - 使用NodeJs搭建的小型web应用
		
原文英文链接:http://www.nodebeginner.org 中文翻译链接:http://www.nodebeginner.org/index-zh-cn.html 学习链接:一本全面的Nod ...
 
随机推荐
- IOS开发经验总结(二)
			
本文转载至 http://dreamahui.iteye.com/blog/1878922 IOS开发总结 by mhmwadm (感谢mhmwadm) 2013/4/10 1 XCode快捷键 4 ...
 - Eclipse之相关快捷键
			
Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[ALT+/] 此快捷键为用户编辑的好帮手,能为用 ...
 - Android TextView使用HTML处理字体样式、显示图片等
			
一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操 ...
 - jquery如何获取type=hidden的input元素的值?
			
function setHiddenFields() { var hiddens = $("input:hidden"); $.each(hiddens, function (in ...
 - Linux云服务器下Tomcat部署超详细
			
基于阿里云Centos 7服务器的Tomcat 项目部署 工具:一台安装jdk1.8的Centos 6/7.X 云服务器(64位) Putty ssh远程连接云服务器的软件 FileZillaCli ...
 - windows10子系统配置vim
			
.cmd背景,字体等配置 (1)设置背景颜色44 50 59 (2)设置字体 大小 颜色 Courier New 20 白色 2.ubuntuvim配置(etc/vim/vimrc):(1)配置vim ...
 - 会议室预订系统 td 宽度 php 浏览器 兼容性
			
w获取浏览器标识 <style> .w > td { <?php $wua=$_SERVER['HTTP_USER_AGENT']; if(strpos($wua, 'Chro ...
 - Cookies, Security, and Privacy  Client Identification
			
w HTTP The Definitive Guide Cookies themselves are not believed to be a tremendous security risk, be ...
 - HI35xx平台调试笔记
			
1.音视频数据循环采集 a. 在sample_venc.c文件中,海思官方是把采集到的数据都保存到文件中,我们需要更改到缓存里,以便后面推送到rtsp/rtmp/hls服务端. ; i < s3 ...
 - sdut3138: N!(计算n!中结尾零的个数)
			
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=3138 算法思想:在1-10两个数相乘要产 ...