什么是代理,nodenginx前端代理详解

一. 什么是代理?

代理就是通过一个特殊的网络服务去访问另一网络服务的一种间接访问方式。像我们不能直接访问国外的网站,只能使用VPN,就是使用了代理

二. 前端为什么要用代理?

首先明确以下两个概念
(1)前端应用要能访问,那必须是放在服务器上(服务器可以是nginx、nodejs、apache、tomcat等),像我们本地vue开发就是用nodejs启动了一个服务。
(2)由于浏览器的同源策略(协议、ip、端口号都相同为同源),禁止网站向非同源的服务器发送ajax异步请求,也就是跨域。
明白以上两点就知道我们本地开发要调用服务器的接口,就会跨域。解决跨域的手段有很多种,像是cors、jsonp等,但是他们都有缺陷,代理是前端解决跨域的终极手段。

浏览器代理服务器后端服务器
本地node 或者nginx

三.代理的使用

node.js

node.js的本地web服务搭建

1. 初始化项目
npm init
2. 安装express(基于Node.js 平台,快速、开放、极简的Web开发框架)
npm install express
3. 新建一个文件夹,把前端打包的资源放里面

在这里插入图片描述

4. 在index.js中引入静态文件
// 导入express模块
const express = require('express')
// 创建express服务实例
const app = express()
// 静态资源
app.use(express.static(__dirname+'/html'))
// app.use("/", express.static('./html'))
app.use("/h5", express.static('./h5/html'))
5. http-proxy-middleware 代理中间件

安装http-proxy-middleware

npm install http-proxy-middleware
6.导入
// 导入 http-proxy-middleware代理中间件
const { createProxyMiddleware } = require("http-proxy-middleware");
7.配置
app.use("/api",createProxyMiddleware({target:'https://***.**.net', // 目标服务器地址pathRewrite:{'^/api': '/testapi', // 重写路径},changeOrigin: true, // 默认是false 是否需要改变原始主机头为目标url})
)
8. 其他配置
const history = require('connect-history-api-fallback')
// connect-history-api-fallback防止history模式下页面刷新404,它将把请求定位到你指定的索引文件(默认为 /index.html)const bodyParser = require("body-parser")
//设定文件上传大小const log4js = require('log4js')
//请求日志
9.完整的index.js文件
// 导入express模块
const express = require('express')
// history模式防止404
const history = require('connect-history-api-fallback')
// 导入日志
const log4js= require('./log-config')
const logger = log4js.getLogger()
// 导入 http-proxy-middleware代理中间件
const { createProxyMiddleware } = require("http-proxy-middleware");
// 文件大小中间件
const bodyParser = require("body-parser");
// 接口上下文
const context = "/api";
// 创建express服务实例
const app = express()
app.use(history())
// 静态资源
app.use(express.static(__dirname+'/html'))
// app.use("/", express.static('./html'))
app.use("/h5", express.static('./h5/html'))// 上传文件大小
app.use(bodyParser.json({limit:'5000kb'}))
app.use(bodyParser.urlencoded({limit:'5000kb',extended:true}))
// app.use(express.json({limit:'5000kb'}))// 打印日志
log4js.useLogger(app,logger)app.use(context,createProxyMiddleware({target:'https://***.***.net', // 目标服务器地址pathRewrite:{'^/api': '/testapi', // 重写路径},changeOrigin: true, // 默认是false 是否需要改变原始主机头为目标url})
)
// 端口号,超时时间
app.listen(5005,(err)=>{if(!err){console.log('启动成功')}
}).setTimeout(500000)

四.Nginx

1. 官网下载 https://nginx.org/en/download.html

说明:下载后的nginx文件夹路径上不能有中文,否者无法启动nginx
[图片]

2. 把打包后的前端文件放到html文件夹下面
3. Nginx的配置文件conf/nginx.conf

说明:nginx配置文件内行尾要加分号,不能有中文空格

4. 配置前端静态文件请求
 location / {root   html/dist;index  index.html index.htm;try_files  $uri $uri/ /index.html;
}
location /h5/ {root   html;index  index.html index.html;try_files $uri $uri/ /h5/index.html;
}location /web/ {alias   html/h5/;# index  index.html index.html;try_files $uri $uri/ /h5/index.html;
}

说明:

  1. 使用 root 时, 服务器里真实的资源路径是 root 的路径拼接上 location 指定的路径
  2. 使用alias顾名思义是代指 location 的别名, 不论location 是什么, 资源的真实路径都是alias所指定的,所以location是匹配浏览器输入的地址, 真实访问的路径就是alias 指定的路径
  3. try_files $uri $uri/ /index.html; 解决页面刷新404
5. 配置接口代理
    location /api {proxy_redirect off; #关闭重定向proxy_set_header Host $host;# $host浏览器请求的ip,$http_host 浏览器请求的ip和端口号,$proxy_host 被代理服务的ip和端口号proxy_set_header X-Real-IP $remote_addr; # 前一节点ip(非用户真实IP)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #前一节点X-Forwarded-Forproxy_pass https://***.***.net/testapi;}
注意点

通过nginx访问https:// * . * .net /api/ login来说明情况

  • location和proxy_pass后都不加斜杠

      location /api {proxy_pass https://***.***.net;}
    

实际访问地址为https://* * . * *.net /api/login

  • location加proxy_pass不加

      location /api/ {proxy_pass https://***.***.net;}
    

实际访问地址为https://* * . * *.net /api/login

  • location和proxy_pass都加

      location /api/ {proxy_pass https://***.***.net/;}
    

实际访问地址为https://* * . * *.net /login

  • location不加proxy_pass加

      location /api {proxy_pass https://***.***.net/;}
    

实际访问地址为https://* * . * *.net /login

  • 总结:

只要是proxy_pass 端口后方加了斜杠的那么 location都会被替换,不会加到实际访问路径中,包括( proxy_pass
https://* * . * *.net/testapi;)也算

6. 其他

client_max_body_size 限制请求体的大小,若超过所设定的大小,返回413错误
client_header_timeout 读取请求头的超时时间,若超过所设定的大小,返回408错误
client_body_timeout 读取请求实体的超时时间,若超过所设定的大小,返回413错误

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/479847.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java脚手架系列16-AI大模型集成

之所以想写这一系列,是因为之前工作过程中有几次项目是从零开始搭建的,而且项目涉及的内容还不少。在这过程中,遇到了很多棘手的非业务问题,在不断实践过程中慢慢积累出一些基本的实践经验,认为这些与业务无关的基本的…

网络安全中的数据科学如何重新定义安全实践?

组织每天处理大量数据,这些数据由各个团队和部门管理。这使得全面了解潜在威胁变得非常困难,常常导致疏忽。以前,公司依靠 FUD 方法(恐惧、不确定性和怀疑)来识别潜在攻击。然而,将数据科学集成到网络安全中…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜…

open-instruct框架使用记录:只使用huggingface数据集的小部分进行训练,如何修改dataset_info.json文件

open-instruct框架 这篇笔记主要记录以下问题:只使用huggingface下载的数据集中的一小部分数据进行数据训练。而且我不想修改open-instruct的加载数据集的代码,以及脚本中的--dataset_mixer_list参数的指定等。下面是我的思路历程。 if args.dataset_na…

Jenkins升级到最新版本后无法启动

1. 场景还原 最近在web界面将jenkins升级到最新版本后,后台无法启动jenkins服务,服务状态如下: 运行jenkins命令提示invalid Java version jenkins --version jenkins: invalid Java version: java version "1.8.0_202" Java(TM)…

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示:ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…

Unity版本使用情况统计(更新至2024年11月)

UWA发布|本期UWA发布的内容是第十五期Unity版本使用统计,统计周期为2024年5月至2024年11月,数据来源于UWA网站(www.uwa4d.com)性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势作为参考。 2024年5月 - 2024年…

Spring Aop 中对JoinPoint的理解

以下是源码中对 JoinPoint 的描述 A runtime joinpoint is an event that occurs on a static joinpoint (i.e. a location in a program). For instance, an invocation is the runtime joinpoint on a method (static joinpoint). The static part of a given joinpoint can…

C中指针在64位操作系统下为什么是4而不是8

好久没写C了,今天用VScode想写个Demo,翻了下指针资料,想打印下指针大小,发现是4,但是理论上64位系统不应该是8么? 结论就是我编的是32位程序,编译器按照32位编译的。 用vscode的C 插件编译运行…

使用 pycharm 新建不使用 python 虚拟环境( venv、conda )的工程

有时候我们发现一个好玩的 demo,想赶快在电脑上 pip install 一下跑起来,发现因为 python 的 venv、conda 环境还挺费劲的,因为随着时间的发展,之前记得很清楚的 venv、conda 的用法,不经常使用,半天跑不起…

鸿蒙主流路由详解

鸿蒙主流路由详解 Navigation Navigation更适合于一次开发,多端部署,也是官方主流推荐的一种路由控制方式,但是,使用起来入侵耦合度高,所以,一般会使用HMRouter,这也是官方主流推荐的路由 Navigation官网地址 个人源码地址 路由跳转 第一步-定义路由栈 Provide(PageInfo) pag…

Flink Sink的使用

经过一系列Transformation转换操作后,最后一定要调用Sink操作,才会形成一个完整的DataFlow拓扑。只有调用了Sink操作,才会产生最终的计算结果,这些数据可以写入到的文件、输出到指定的网络端口、消息中间件、外部的文件系统或者是…

鸿蒙本地模拟器 模拟TCP服务端的过程

鸿蒙模拟器模拟TCP服务端的过程涉及几个关键步骤,主要包括创建TCPSocketServer实例、绑定IP地址和端口、监听连接请求、接收和发送数据以及处理连接事件。以下是详细的模拟过程: **1.创建TCPSocketServer实例:**首先,需要导入鸿蒙…

【VUE3】新版Vue3+ElementPlus全家桶开发视频项目实战

VUE 介绍 Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。 Vue.js是一个MVVM(Model - View - ViewModel)的SPA框架。 Model:数…

Edify 3D: Scalable High-Quality 3D Asset Generation

Deep Imagination Research | NVIDIA 目录 一、Abstract 二、核心内容 1、多视图扩散模型 3、重建模型: 4、数据处理模块: 三、结果 1、文本到 3D 生成结果 2、图像到 3D 生成结果 3、四边形网格拓扑结构 一、Abstract NVIDIA 开发的用于高质量…

Python爬虫能处理动态加载的内容吗?

Python爬虫确实可以处理动态加载的内容。动态加载的内容通常是通过JavaScript在客户端执行,这意味着当网页首次加载时,服务器返回的HTML可能并不包含最终用户看到的内容。相反,JavaScript代码会在页面加载后从服务器请求额外的数据&#xff0…

JavaScript练习2——动态“钟”的绘制

实现效果: 分析需求: 1、需要每隔一定时间间隔执行一次绘图,实现旋转效果 2、需要绘制矩形框、圆形缺口框、文字 3、需要设置style 代码实现: 下面给出关键代码的实现,部分函数在之前的文章已经给出 https://blog.…

Jira使用笔记二 ScriptRunner 验证问题创建角色

背景 最近在对公司Jira工作流改造,收到这么一个要求:某些问题类型只有某些角色可以创建。本来是想通过Jira内建的权限控制来处理的。结果点到权限页面,心都凉透了。 好吧,那只能上脚本了。最终使用ScriptRunner的Simple scripte…

Java中的线程池使用详解

文章目录 Java中的线程池使用详解一、引言二、线程池的创建与使用1、线程池的创建1.1、FixedThreadPool(固定大小线程池)1.2、CachedThreadPool(可缓存线程池)1.3、SingleThreadExecutor(单线程化线程池)1.…

3D扫描对文博行业有哪些影响?

三维扫描技术对文博行业产生了深远的影响,主要体现在以下几个方面: 一、高精度建模与数字化保护 三维扫描技术通过高精度扫描设备,能够捕捉到文物的每一个细节,包括形状、纹理、颜色等,从而生成逼真的3D模型。这些模…