http-proxy-middleware及express实现反向代理
$ npm install --save-dev http-proxy-middleware
npm install express
// 引用依赖
var express = require('express');
var proxy = require('http-proxy-middleware'); // proxy 中间件的选择项
var options = {
target: 'http://www.example.org', // 目标服务器 host
changeOrigin: true, // 默认false,是否需要改变原始主机头为目标URL
ws: true, // 是否代理websockets
pathRewrite: {
'^/api/old-path' : '/api/new-path', // 重写请求,比如我们源访问的是api/old-path,那么请求会被解析为/api/new-path
'^/api/remove/path' : '/path' // 同上
},
router: {
// 如果请求主机 == 'dev.localhost:3000',
// 重写目标服务器 'http://www.example.org' 为 'http://localhost:8000'
'dev.localhost:3000' : 'http://localhost:8000'
}
}; // 创建代理
var exampleProxy = proxy(options); // 使用代理
var app = express();
app.use('/api', exampleProxy);
app.listen();
https://www.cnblogs.com/resultwp/p/9945606.htm vue 非常规跨域实现 proxyTable 设置及依赖
、config/index.js 设置跨域的地址
proxyTable: {
'/api': { //跨域标识 请求地址为‘http://1xxx.xxx.com/index/list’, 请求时 “/api/index/list”
target: 'http://1xxx.xxx.com',
changeOrigin: true, //允许跨域
pathRewrite: { //重新跨域标识
'^/api': ''
}
}
}, 、build/webpack.dev.conf.js 引入express、http-proxy-middleware,如下:
const proxyMiddleware = require('http-proxy-middleware') var express = require('express')
var app = express()
// proxy api requests
const proxyTable=config.dev.proxyTable;
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
const express = require('express')
const app = express()
b、引入反向代理插件 http-proxy-middlewar
const proxyMiddlewar = require('http-proxy-middlewar')
代理配置
ok,这两个就是进行反向代理的准备工作。下面开始进行反向代理配置。首先,需要知道的是后端服务器的ip和端口号,
const proxyPath = 'http://168.96.0.1:8080' // 注意,这里只需要IP和端口号就可以了。这个ip我瞎写的
然后,将这个path配置到代理配置项中
const proxyOption = {target: proxyPath,changeOrigin: true}
现在用express使用这个代理就好了
app.use('/api', proxyMiddlewar(proxyOption)) // 下面详细说明这一段
app.listen() //表示监听的端口号也就是本地的端口号。用vue-cli构建的项目不需要写这行代码
express指定返回的拦截器处理:
const express = require("express");
const http = require("http");
const app = express();
////////////////////// 添加Log4js配置 /////////////////////////////
log.use(app); ////////////////////// 获取post过来的数据 /////////////////////////////
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false })); ////////////////////// 设置web工程的根目录 /////////////////////////////
app.use(express.static(__dirname + '/')); ////////////////////// 允许跨域 /////////////////////////////
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",' 3.2.1')
if(req.method=="OPTIONS") res.send();/*让options请求快速返回*/
else next();
}); ////////////////////// 利用文件来拆分路由的规模 /////////////////////////////
var apiRouterIndex = require('./routes/api/apiRouterIndex');
app.use('/api', apiRouterIndex); ////////////////////// 404处理 /////////////////////////////
app.get('*', function (req, res){
console.log('404 handler..')
res.render('common_page/404.html', {
status: ,
title: 'NodeBlog',
});
}); const server = http.createServer(app).listen(,'localhost',function () {
const host = server.address().address;
const port = server.address().port;
// console.log("应用实例,访问地址为 http://%s:%s", host, port);
process.env.host = host;
// process 不能存储JSON格式的数据
process.env.port = port;
global.userInfo = {
name: 'huangbiao',
age:
}
app.SERVER_INFO = {
name: 'zhangsan',
age:
}
});
需要使用app.use('/api', apiRouterIndex);
这种方式配置URL请求的范围
const express = require('express');
const router = express.Router();
const tokenConfig = require('../common/config/tokenConfig');
// 处理token 的同一工具
const jwtUtils = require('../common/util/jwtUtils');
const apiService = require('./service/apiService.js');
var jwt= require('jsonwebtoken'); // 使用jwt签名
var fs = require('fs'); // 用来验证token,作为后台管理的拦截器
router.use(function (req, response, next) {
var isToken = jwtUtils.checkTokenByRequest(req);
// 如果获取的token 不合格,则给出提示信息
if (!isToken) {
response.status().json({
state: ,
message: 'token数据不正确'
});
return false;
}
next();
});
// 查询所有的标签 接口
router.get('/tags/list', function(req, res, next) {
// 创建tag标签
apiService.queryTagList({},function (err, results, fields) {
res.json({
data: results
});
});
}); // 删除标签 接口
router.post('/tags/delete', function(req, res, next) {
console.log(req.body);
var id = req.body.id;
// 删除tag标签
apiService.deleteTagById(id, function (err, result) {
res.json({
status: true
});
});
});
module.exports = router;
在所有URL前面添加一个router.use(function (req, response, next) {next();});
方法,用来验证token是否正确,这个拦截器只是针对http://localhost:3000/api
打头的请求
// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 创建 token 类
class Jwt {
constructor(data) {
this.data = data;
}
// 检查token
static checkTokenByRequest (requestObj) {
// 拿取token 数据 按照自己传递方式写
var tokenOrigin = requestObj.headers['Authorization'] || requestObj.headers['authorization'];
if (tokenOrigin === '' || tokenOrigin === undefined || tokenOrigin === null ) {
console.log('的值不能为空')
return false;
}
// 获取服务器返回的token值
var tokenStr = tokenOrigin.split(' ')[];
if (tokenStr === '' || tokenStr === undefined || tokenStr === null ) {
console.log('token 格式不正确')
return false;
}
return tokenStr;
}
// 从header请求中获取token
static getTokenFromHeader (requestObj) {
var tokenStr = this.checkTokenByRequest(requestObj);
if (tokenStr) {
return tokenStr;
} else {
return null;
}
}
} module.exports = Jwt;
https://www.jianshu.com/p/a248b146c55a http-proxy-middleware
https://blog.csdn.net/xmloveth/article/details/56847456 npm模块之http-proxy-middleware使用教程(译
https://www.jianshu.com/p/47c9e65f5a04 Vue项目中使用express实现反向代理
https://blog.csdn.net/hbiao68/article/details/85769755 express指定返回的拦截器处理
https://www.jianshu.com/p/9401a099c032?utm_source=oschina-app node.js之express模块
http-proxy-middleware及express实现反向代理的更多相关文章
- Forward Proxy & Reverse Proxy | 正向代理 和 反向代理
对请求和响应内容不做修改的转发的服务器,被称为代理服务器.代理服务器分为两种类型:正向代理 和 反向代理. 正向代理:面向互联网,从更广范围获取信息的代理. 反向代理:面向内部,一般用于某企业的网站的 ...
- 反向代理(Reverse Proxy)
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时 ...
- golang http proxy反向代理
本文介绍golang中如何进行反向代理. 下面例子中, proxy server接收client 的 http request,转发给true server,并把 true server的返回结果再发 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy nginx反向代理原理和配置讲解 防止外部客户机获取内部内容服务器的重定向 URL 缓存命中
[大型网站技术实践]初级篇:借助Nginx搭建反向代理服务器 - Edison Chou - 博客园http://www.cnblogs.com/edisonchou/p/4126742.html 图 ...
- Nginx应用-Location路由反向代理及重写策略 请求转发-URL匹配规则 NGINX Reverse Proxy
NGINX Docs | NGINX Reverse Proxy https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/ ...
- 用express框架实现反向代理
目前很多公司开发都是前后台分离开发,于是我用node起了一个服务,用node中的express框架实现了反向代理.(通俗易懂的讲就是我在我的电脑访问不到后台同事的电脑接口,这样做以后就可以在我本地访问 ...
- 反向代理Reverse proxy
https://www.zhihu.com/question/24723688/answer/160252724 反向代理在计算机世界里,由于单个服务器的处理客户端(用户)请求能力有一个极限,当用户的 ...
- 正向代理 forward proxy、反向代理 reverse proxy、透明代理 transparent proxy
https://zh.wikipedia.org/wiki/反向代理 反向代理在计算机网络中是代理服务器的一种.服务器根据客户端的请求,从其关系的一组或多组后端服务器(如Web服务器)上获取资源,然后 ...
- Docker Nginx-Proxy 容器Nginx Proxy反向代理
Docker Nginx-Proxy 容器Nginx Proxy反向代理 简单介绍 Docker容器的自动Nginx反向代理 dockerhub地址 https://hub.docker.co ...
随机推荐
- 【异常】Maxwell异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at line 1, column 596. Encountered: <EOF> after : ""
1 详细异常 Exception in thread "main" net.sf.jsqlparser.parser.TokenMgrError: Lexical error at ...
- nginx连接php测试
1 nginx连接php [root@web01 /application/nginx/conf/conf.d]# cat docs.conf server { server_name docs.ol ...
- SASS 和 LESS 的区别
1.编译环境不同 SASS 的安装需要 Ruby 环境,是在服务端处理的: LESS 需要引入 less.js 来处理代码输出 CSS 到浏览器,也可以在开发环节使用 LESS,然后编译成 CSS 文 ...
- Java stackoverflowerror异常与outofmemoryerror异常区别
1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态:当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中 ...
- evpp return index.html
https://github.com/yuqingtong1990/ggtalk_server/blob/99f0f85c683dc0a0c3e76dcae611f60f6456eed6/server ...
- SQLSERVER视图错位的解决办法
原始需求如下: 有一个表T1 create table t1 (id int not null primary key ,v1 ) ) ,'aaa'); ,'bbb'); 有一个表TS,用于记录T1中 ...
- feign.RetryableException: Read timed out executing xxx
feign.RetryableException: Read timed out executing GET http://common-item/service/item/selectTbItemA ...
- HDU-2082-找单词(母函数)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2082 题意: 假设有x1个字母A, x2个字母B,..... x26个字母Z,同时假设字母A的价值为1, ...
- selenium之python源码解读-expected_conditions
一.expected_conditions 之前在 selenium之python源码解读-WebDriverWait 中说到,until方法中method参数,需要传入一个function对象,如果 ...
- Java8实战,
Supplier 1, @FunctionalInterfacepublic interface Supplier<T> { 2, T get(); 3, Supplier<A ...