location重定向和nginx代理
文章目录
- 1 location重定向
- 1.1 概述
- 1.2 rewrite跳转
- 1.3 用例
- 1.4 实验
- 1.4.1 基于域名的跳转
- 1.4.2 基于ip的跳转
- 1.4.3 基于后缀名的跳转
- 2 nginx的代理
- 2.1 nginx内置变量
- 2.2 正向代理
- 2.2.1 固定正向代理
- 2.2.2 自动代理
- 2.3 反向代理
- 2.3.1 负载均衡的算法
- 2.3.2 负载均衡的特点
- 2.3.3 负载均衡的语法
- 2.3.3.1 七层代理
- 2.3.3.2 四层代理
1 location重定向
1.1 概述
重定向:就是输入的网站之后会跳转到设定的目标网址。
使用场景:
1、更换域名
2、特殊情况,比如页面需要维护,但是不想中断服务,可以实现url的跳转,访问正常的服务器。
3、防盗链
1.2 rewrite跳转
rewrite:使用nginx提供的全局变量或者是自定义设置的变量,结合正则表达式和标志位实现url/uri重定向。
-
前提:编译安装时需配置有
ngx_http_rewrite_module
支持url重定向支持条件判断:if语句(没有else)
-
语法配置:
rewrite 正则表达式 跳转后的内容 标志位
-
标志位的类型:
-
permanent
:返回码是301,永久重定向 -
redirect
:返回码302,临时重定向 -
break
:跳转时不会改变urlbreak是按照location的规则进行匹配的,匹配到即终止。返回码是200,不属于3**开头的重定向范围之内。
-
last
:本条规则匹配完毕之后,继续向下匹配新的location规则last一旦陷入死循环,内部循环10次就会停止,然后报错500。
break
和last
没有跳转的返回码,属于匹配location的机制 -
-
500(内部服务器错误)排错:
一、服务器故障
二、防火墙屏蔽
三、应用的端口没有启动
1、配置文件写错了
2、有其他应用占用了本服务的端口
3、服务器资源不够,应用无法启动
4、磁盘空间不足
四、last匹配机制导致陷入死循环,10次之后就会报错500
五、检查网络
1.3 用例
rewrite /test/(.*)/xy104/$1 redirect;
-
(.*)
:正则表达式匹配的内容进行捕获 -
$1
:前面正则表达式捕获的内容/usr/local/nginx/html/test/index.html --------------> /usr/local/nginx/html/xy104/index.html
-
301和302:
- 301永久重定向:永久性的变更url,搜索引擎的排名和权重会转移到新的url,客户端会保留新的url。
- 302临时重定向:短期的url变更,一般用在维护时,搜索引擎的排名和权重不会转移到新的url。客户端会继续访问原始的url。
1.4 实验
1.4.1 基于域名的跳转
http://www.xy105.com --------------> http://www.xy104.com
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;location / {if ($host = 'www.xy105.com') {rewrite ^/(.*)$ http://www.xy104.com/$1 permanent;}root html;index index.html index.htm;}
}nginx -t
systemctl restart nginx.servicevim /etc/hosts
# 本地添加ip域名映射
192.168.159.210 www.xy105.com www.xy104.com
rewrite ^/(.*)$ http://www.xy104.com/$1 permanent;
匹配$host
的路径,即将http://www.xy105.com/(.*) 重定向至http://www.xy104.com/$1
1.4.2 基于ip的跳转
192.168.159.210服务器的网页正在维护,只有本机可以访问,其他主机访问统一显示正在维护中
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;set $rewrite true;#set 设置变量的值,$rewrite的值设置布尔类型的trueif ($remote_addr = '192.168.159.210') {#$remote_addr获取客户端请求的ip地址set $rewrite false;#重新定义rewrite的值是false,不进行重定向}if ($rewrite = true) {rewrite (.+) /error.html;#非192.168.159.210的ip地址,统一跳转到/error.html的页面内容}location = /error.html {root html;}location / {root html;index index.html index.htm;}
}echo "正在维护中" > html/error.html
echo "testing" > html/index.html
systemctl restart nginx.service
1.4.3 基于后缀名的跳转
http://www.xy105.com/test1/index.php
http://www.xy104.com
vim /usr/local/nginx/conf/nginx.confserver {listen 80;server_name www.xy105.com;charset utf-8;#access_log logs/host.access.log main;location ~* \.php$ {rewrite ^/(.*)(\.php)$ http://www.xy104.com;root html;index index.html;}
}
2 nginx的代理
常见的代理有VPN
在内网环境中,只有特定的ip地址才可能访问内网的服务(ssh,网页):堡垒机(跳板机)
nginx代理
-
正向代理(七层代理)
- 正向代理的原理:访问一个代理的地址--------------> 目标访问的网页
-
反向代理(四层代理、七层代理)
- 四层(传输层):ip+端口
- 七层(应用层):http协议
四层代理和七层代理之间的区别:
-
四层代理是基于tcp/ip协议层的代理转发方式,只是基于ip+端口号的形式实现代理。四层代理无法获取http请求中的url信息,只是对数据包进行转发。
- 四层转发数据包,是由内核进行转发,速度更快。
-
七层代理是通过http协议进行代理转发的方式
-
处理http的请求和响应,当收到http请求之后,根据代理的方式,把http请求转发到指定的服务器。
-
可以对http请求进行深入的分析和处理的。可以对请求内容做路由,流量控制,可以内容过滤等等。
-
七层代理是由应用层处理,用户态来处理,速度相对较慢,但是更安全,更可靠
-
同时能做四层代理和七层代理的:nginx、Haproxy
LVS:只能做四层转发
2.1 nginx内置变量
-
$uri
:可以获取客户端请求的地址,不包含主机和查询的参数 -
$request_uri
:获取客户端的请求地址,包含主机和查询参数 -
$host
:请求的主机名,客户端----发送请求的url地址 -
$http_user_agent
:获取客户端请求的浏览器和操作系统 -
$remote_addr
:客户端的ip地址(可以隐藏) -
$remote_port
:客户端请求的端口 -
$server_addr
:可以查询到服务端的ip地址 -
$server_port
:服务端的端口号 -
$request_method
:获取客户端的请求方式,get/post -
$scheme
:获取请求的协议 http协议 https -
$request_filename
:获取客户端请求的文件名 -
$document_root
:当前请求的根目录
nginx在配置location匹配时,会使用两个获取头部的内置变量:
-
X-Real-IP
:直接向服务端发送客户端访问的真实ip地址proxy_set_header X-Real-IP $remote_addr;
-
X-Forwarded-For
:传递完整的代理链,只要数据包经过代理,都会被传送nginx,记录所有的代理地址和客户端的真实ip。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
实验:查看nginx内置变量
location / {root html;index index.html index.htm;default_type text/plain;return 200 "test1:$uri\ntest2:$request_uri\ntest3:$host\ntest4:$http_user_agent\ntest5:$remote_addr\ntest6:$remote_port\ntest7:$server_addr\ntest8:$server_port\ntest9:$request_method\ntest10:$scheme\ntest11:$request_filename\ntest12:$document_root";
}
2.2 正向代理
2.2.1 固定正向代理
mkdir /usr/local/nginx/conf.d
vim /usr/local/nginx/conf/nginx.confhttp {include mime.types;default_type application/octet-stream;include /usr/local/nginx/conf.d/*.conf;#添加了这一段之后,可以在conf.d这个目录里面,配置多个conf文件,也可以有其他的配置文件,作为服务的配置文件
}#因为是写在主配置文件nginx.conf的http模块中,所以直接写server模块
server {listen 8888;server_name localhost;resolver 218.2.135.1 valid=300 ipv6=off;#设置dns的解析地址,解析的缓存时间是300秒,每隔300秒重新解析一次resolver_timeout 3s;#设置解析服务的超时3秒proxy_read_timeout 30s;#设置代理服务器读取的超时时间proxy_send_timeout 30s;#代理服务器向后端服务器发送数据的超时时间proxy_connect_timeout 30s;#代理服务器和后端服务器连接的超时时间#固定代理地址set $url "www.baidu.com";location / {proxy_pass http://$url;#请求转发的语句 只要你访问nginx 192.168.233.61------->> www.baidu.com ip+端口 url:8080#正向代理的缓存配置proxy_buffers 256 4k;#设置后端缓存影响的缓冲区为256个,每个大小为4k。proxy_max_temp_file_size 0;#nginx不保存响应数据的临时文件,防止文件过多,占用硬盘空间proxy_cache_valid 200 302 1m;#针对响应码是200和302,缓存的有效期是1分钟proxy_cache_valid 301 1h;#针对响应码是301,缓存的有效期是1小时proxy_cache_valid any 1m;#除了200,301,302以外,其他的响应码都缓存1分钟}
}
2.2.2 自动代理
vim /usr/local/nginx/conf.d/auto_proxy.conf
server {listen 8889;location / {proxy_pass $scheme://$http_host$request_uri;#请求代理的地址自动设置 自动选择协议 http https $http_host 目标主机 $request_uri包含完整的请求的路径proxy_set_header Host $http_host;#在请求头当中传递客户端的host信息proxy_set_header X-Real-IP $remote_addr;#设置客户端的请求当中包含真实的ip地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;#传递客户端经过的代理地址proxy_set_header X-Forwarded-Proto $scheme;#传递客户端的请求的协议信息http httpsproxy_set_header X-Forwarded-Host $host;#传递客户端的主机名(IP地址)proxy_set_header X-Forwarded-Port $server_port;#传递给服务端,客户端请求服务端的端口resolver 218.2.135.1;#设置dns地址resolver_timeout 10s;proxy_buffers 256 4k;proxy_max_temp_file_size 0;proxy_cache_valid 200 302 1m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m;}
}curl -x http://192.168.159.210:8889 http://www.sina.com
#自动代理只能通过命令行的命令实现
2.3 反向代理
2.3.1 负载均衡的算法
-
轮询:round robin(rr)负载均衡的默认算法,请求轮流分配给后端服务器。
轮询算法适用于后端服务器处理能力相近的情况,默认的算法,可以不加。
-
加权轮询:weight round robin 轮询的升级版,给每个后端服务器赋予不同的权重。
处理能力更强的服务器设置更高的权重。处理能力的低的,设置低权重。
高峰时间可以通过这个方法进行流量的优化。适用于服务器处理能力差异比较大的情况。
-
ip_Hash:当访问后端服务器,根据客户端的ip地址,使用hash算法计算出ip地址的hash值,然后再把请求发送到相应的后端服务器。
如果客户端访问的ip地址相同,通过hash算法,再一次的请求会被分配到上一次访问的服务器。保证会话的稳定。
负载均衡的会话保持通过ip_hash实现。会话保持到期之后,会话中断,重新请求会重新计算hash值。
-
最小连接数:最少连接数的算法可以将请求发送到当前连接比较少的后端服务器。(通常配合加权轮询一块使用)
这种算法适用后端服务器处理任务耗时不同的情况,可以有效的避免所有的请求集中在处理能力更强的后端服务器上。
-
URL_HASH:根据请求当中url地址来计算hash值,如果客户端请求的url请求相同,客户端的请求会被分配到同一个服务器上。
如果后台服务器的数量发生变化,会影响结果。
2.3.2 负载均衡的特点
- 根据算法把请求分发到不同的服务器。
- 客户端访问的是代理地址,响应也是代理服务器响应。
- 客户端并不了解后端服务器的情况。
- 可以提高安全性,后端服务器是隐藏的。
- 负载均衡是有缓存的,可以直接访问缓存,提高响应速度。
2.3.3 负载均衡的语法
实验架构如下:
nginx1—192.168.159.200—代理服务器
nginx2—192.168.159.210—后端服务器1
nginx3—192.168.159.220—后端服务器2
客户端:浏览器
配置流量分发,主要是依靠代理服务器完成的,主要配置在代理服务器完成,配置算法。
2.3.3.1 七层代理
upstream
:模块仅支持http协议,用来处理http的请求和响应
语法:upstream只能写在http模块当中。不能在server也不在全局。
- 轮询
http {upstream kc {server 192.168.159.210;server 192.168.159.220;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- 加权轮询
http {upstream kc {server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- ip_Hash
http {upstream kc {ip_hash;server 192.168.159.210;server 192.168.159.220;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- 最小连接数
http {upstream kc {least_conn;server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
- URL_HASH
http {upstream kc {hash $request_uri consistent;server 192.168.159.210 weigh=100;server 192.168.159.220 weight=50;}server {location / {root html;index index.html index.htm;proxy_pass http://kc;}}
}
2.3.3.2 四层代理
四层代理必须在nginx安装时配置stream模块
stream
:不支持http协议,仅支持tcp和udp,处理数据包的流量分发
语法:四层代理需要写在全局模块当中
- 轮询
stream {upstream kc {server 192.168.159.210:80;#需要写明端口号server 192.168.159.220:80;}server {listen 81;#需要修改端口号,否则会和http模块中的server模块监听端口冲突proxy_pass kc;}
}
- 加权轮询
stream {upstream kc {server 192.168.159.210:80 weight=100;server 192.168.159.220:80 weight=50;}server {listen 81;proxy_pass kc;}
}
- 最小连接数
stream {upstream kc {least_conn;server 192.168.159.210:80;#需要写明端口号server 192.168.159.220:80;}server {listen 81;#需要修改端口号,否则会和http模块中的server模块监听端口冲突proxy_pass kc;}
}
ip_hash和url_hash不能在四层代理当中使用的。
相关文章:

location重定向和nginx代理
文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…...

iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...

Edge SCDN深度解析,边缘安全加速的创新实践
边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…...

solidworks常见问题已解决
solidworks常见问题已解决 问题1:step总是提示默认模板无效。问题2:异型孔向导”时出现了“找不到标准数据库。问题3:找不到CalloutForm.txt文件,标注将由几何体定义。问题5:工程图显示文件损坏不能保存。问题6&#x…...

vCenter开启HA报错
昨天给客户开启vCenter开启HA功能报错,报错的内容比较多 博通官方给出解决办法 https://knowledge.broadcom.com/external/article/318929/error-vsphere-ha-agent-cannot-be-correct.html 常规的解决办法 1.关闭集群HA,再次开启HA 2.主机进入维护模式,再次加入…...

在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?
make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…...

js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写
问: 我按在要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写? 回答: 问: <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…...

前端使用 Cursor 的最佳助手 - PromptCoder
前端使用 Cursor 的最佳助手 - PromptCoder 你是否正在使用 Cursor 进行前端开发,却苦于繁琐的代码生成和原型图的还原?你是否渴望一个更高效、更智能的工具来提升你的开发效率?那么,你一定不能错过 PromptCoder! Pr…...

深入了解 Spring IOC,AOP 两大核心思想
文章目录 一、Spring 基础 - 控制反转(IOC)1.1. 引入1.2. 如何理解 IOCSpring Bean 是什么?IoC 是什么?IoC 能做什么?IoC 和 DI 是什么关系? 1.3. IoC 配置的三种方式xml 配置Java 配置注解配置 1.4. 依赖注…...

QT从入门到精通——Qlabel介绍与使用
1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…...

华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!
文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器(父子单向通信)1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器(父子双向通信)1. Link装饰器的特点3. Link使用示例 四…...
node.js 环境配置
node_global下创建node_modules 系统变量 新建NODE_Path -> node_modules的路径 用户变量 编辑Path 编辑…\npm为 node_modules的路径 系统变量 Path 新建 %NODE_PATH% CMD测试 npm install express -g 报错 npm error code ETIMEDOUT源的连接超时,没用了要换源 …...
高并发数据采集场景下Nginx代理Netty服务的优化配置
高并发数据采集场景下,要优化Nginx反向代理来支持多个Netty数采服务并保证稳定的性能,可以从以下几个方面对Nginx进行优化配置。 直连模式(直接通过 Nginx 处理与后端 Netty 服务的连接,而不作为反向代理),…...

【C++算法】40.模拟_N 字形变换
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 6. N 字形变换 题目描述: 解法 解法一:模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去,最后从左往右读取。 解法二:模拟优化-…...
【云计算】虚拟化技术
目录 1. 虚拟化技术在云计算中的那些地方发挥了关键作用? 2. 比较VMare,Xen等虚拟化产品的关键技术,以及对云计算技术提供的支持? 3. 服务器虚拟化,存储虚拟化和网络虚拟化都有哪些实现方式? 4. 讨论桌面…...

手机租赁系统开发指南一站式服务流程解析
内容概要 手机租赁系统的开发是一个复杂但有趣的过程,像搭建乐高一样,只要找到合适的模块,就能打造出一个宾至如归的租赁平台。在这部分,我们将对开发流程的整体结构进行简要概述,并指出每个环节的重要性。 首先&…...
【机器学习】—时序数据分析:机器学习与深度学习在预测、金融、气象等领域的应用
云边有个稻草人-CSDN博客 目录 引言 1. 时序数据分析基础 1.1 时序数据的特点 1.2 时序数据分析的常见方法 2. 深度学习与时序数据分析 2.1 深度学习在时序数据分析中的应用 2.1.1 LSTM(长短期记忆网络) 2.2 深度学习在金融市场预测中的应用 2…...

OBS + SRS:打造专业级直播环境的入门指南
OBS SRS:打造专业级直播环境的入门指南 1. OBS简介2. OBS核心功能详解2.1 场景(Scenes)管理2.2 源(Sources)控制2.3 混音器功能2.4 滤镜与特效2.5 直播控制面板 3. OBS推流到SRS服务器配置指南3.1 环境准备3.2 OBS推流…...

收银系统源码-会员管理
会员制早已成为门店经营首选的营销工具,尤其是针对连锁多门店会员管理尤为重要。 必然要求门店的收银系统需要支持会员管理,能提供多种会员权益; 1.会员类型 收银系统支持常规会员、plus付费会员、可绑定实体卡; plus会员&…...
MongoDB深化与微软的合作,新增人工智能和数据分析集成和微软 Azure Arc支持
日前,在微软Ignite技术大会上,MongoDB公司宣布面向MongoDB与微软共同客户推出三项新功能,双方协作更进一步。首先,需要构建由检索增强生成 (RAG) 技术驱动的应用程序的客户,现在可以选择MongoDB Atlas作为微软Azure AI…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...