Nginx Rewrite

Nginx Rerite概述

Nginx Rerite基本操作

location与rewrite的区别

location  通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发

rewrite   对用户的URL访问路径进行重写,再重定向跳转访问重写的路径

Nginx正则表达式

校验数字的表达式

数字:^[0-9]*$

n位的数字:^\d{n}$

至少n位的数字:^\d{n,}$

m-n位的数字:^\d{m,n}$

零和非零开头的数字:^(0|[1-9][0-9]*)$

非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$

正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$

有两位小数的正实数:^[0-9]+(.[0-9]{2})?$

有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$

非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

非负整数:^\d+$ 或 ^[1-9]\d*|0$

非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

location三大类

精准匹配:location = / {...}
一般匹配:location / {...} 
正则匹配:location ~ / {...}

location 常用的匹配规则

= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 正则匹配location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。

location 优先级

首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰符的一般前缀匹配
最后是交给 / 通用匹配

在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location,
如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location

前缀匹配看长度,最长的优先匹配
正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求

只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

location 示例说明

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但后面前缀路径会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

优先级总结:
(location = 完整路径) > (location ^~ 最长路径) > (location ~,~* 正则顺序) > (location 部分前缀路径) > (location /)

网站的通过匹配规则

#网站首页匹配
location = / {
    root 网页根目录;
    index index.html;
}

#网站静态页面,通过前缀匹配或通用匹配在nginx服务器本地处理
location ~ /static/ {
    root 目录;
}

location / {
    root 目录;
}

#网站动态页面,通过匹配不同的动态网页文件后缀转发给不同的后端应用服务器处理
location \.php$ {
    fastcgi_pass PHP服务器地址:端口;
}

location \.jsp$ {
    proxy_pass TOMCAT服务器地址:端口;
}

rewrite

rewrite功能

使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

通常情况下只能对域名后面进行重写与重定向

rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块 set 指令:创建新的变量并设其值
 

rewrite的全局变量


$remote addr //获取客户端ip$binary remote addr //客户端ip(二进制)$remote port //客户端port,如:50472$remote user//已经经过AuthBasicModule验证的用户名$host //请求主机头字段,否则为服务器名称,如:blog.sakmon.com$request //用户请求信息,如:GET?a=1&b=2HTTP/1.1$request filename //当前请求的文件的路径名,由root或alias和URIrequest组合而成,如:/2013/81.h1$status //请求的响应状态码,如:200$body_bytes_sent //响应时送出的body字节数数量。即使连接中断,这个数据也是精确的,如:40$content length //等于请求行的“Content Length”的值$content type // 等于请求行的“content Type”的值$http referer //引用地址$http user agent //客户端agent信息,如:Mozilla/5.0(Windows NT5.1)AppleWebKit/537.36(KH$args //与$query string相同等于当中URL的参数(GET),如a=1&b=2$document_uri //与$uri相同这个变量指当前的请求URI,不包括任何参数(见$args)如:/2013/81.htm1$document root //针对当前请求的根路径设置值$hostname //如:centos53.localdomain$http cookie //客户端cookie信息$cookie CO0KIE//cookie COOKIE变量的值$is_args //如果有$args参数,这个变量等于”?”,否则等于”",空值,如?$limit rate //这个变量可以限制连接速率,0表示不限速$query string // 与$args相同 等于当中URL的参数(GET),如a=1&b=2$request body // 记录POST过来的数据信息$request body file //客户端请求主体信息的临时文件名$request method //客户端请求的动作,通常为GET或POST,如:GET$request uri //包含请求参数的原始URI,不包含主机名,如:/2013/81.htm1?a=1&b=2$scheme //HTTP方法(如http,https),如:http$uri //这个变量指当前的请求URI,不包括任何参数(见$args)如:/2013/81.html$request_completion //如果请求结束,设置为0K,当请求未结束或如果该请求不是请求链串的最后一个时,为$server_protocol //请求使用的协议,通常是HTTP/1.0或HTTP/1.1,如:HTTP/1.1$server addr //服务器IP地址,在完成一次系统调用后可以确定这个值$server name //服务器名称,如:blog.sakmon.com$server port //请求到达服务器的端口号,如:80

rewrite 执行顺序

(1) 执行 server 块里面的 rewrite 指令。
(2) 执行 location 匹配。
(3) 执行选定的 location 中的 rewrite 指令。


语法格式:rewrite <正则表达式> <跳转后的路径> [标记位];
regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。

标记位说明

last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

rewrite 示例 

(1)基于域名的跳转

现在公司旧域名www.xy101.com有业务需求变更,需要使用新域名www.xy102.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;        #日志修改
    location / {
    #添加域名重定向
        if ($host = 'www.xy101.com'){                        #$host为rewrite全局变量,代表请求主机头字段或主机名
            rewrite ^/(.*)$ http://www.xy102.com/$1 permanent;    #$1为正则匹配的内容,即“域名/”之后的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}


echo "192.168.80.10 www.xy101.com www.xy102.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.xy101.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.xy102.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

(2)基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.10访问正常。
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;        #日志修改

    #设置是否合法的IP标记
    set $rewrite true;                            #设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
    if ($remote_addr = "192.168.80.10"){        #当客户端IP为192.168.80.10时,将变量值设为false,不进行重写
        set $rewrite false;
    }
    #除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){                        #当变量值为true时,进行重写
        rewrite (.+) /weihu.html;                #将域名后边的路径重写成/weihu.html后转发,例如www.xy101.com/weihu.html
    }
    location = /weihu.html {
        root /var/www/html;                        #网页返回/var/www/html/weihu.html的内容
    }
    
    location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /var/www/html/
echo "<h1>We are maintaining now!</h1>" > /var/www/html/weihu.html
systemctl restart nginx
只有 IP 为 192.168.80.10 能正常访问,其它地址都是维护页面

--------------------------------------------------------
如果rewrite (.+) /weihu.html; 换成rewrite (.+) /weihu.html permanent; 的话,若不是 192.168.80.10 的主机访问会使浏览器修改请求访问的 URL 成 http://www.xy101.com/weihu.html 再请求访问,这样就会进入一直在 rewrite 的死循环,访问请求会一直被重写成 http://www.xy101.com/weihu.html 再请求访问
--------------------------------------------------------

(3)基于旧域名跳转到新域名后面加目录

现在访问的是 http://bbs.xy101.com/post/,现在需要将这个域名下面的访问都跳转到http://www.xy101.com/bbs/post/
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  bbs.xy101.com www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;
    #添加
    location /post {
        rewrite (.+) http://www.xy101.com/bbs$1 permanent;        #这里的$1为位置变量,代表/post
    }
    
    location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /usr/local/nginx/html/bbs/post
echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.80.10 bbs.xy101.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.xy101.com/post/1.html 跳转到 http://www.xy101.com/bbs/post/1.html


(4)基于参数匹配的跳转

现在访问http://www.xy101.com/100-(100|200)-100.html 跳转到http://www.xy101.com页面。
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;
    
    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.xy101.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}

-------------------------------------------------
$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.xy101.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html
-------------------------------------------------

systemctl restart nginx
使用浏览器访问 http://www.xy101.com/100-200-100.html 或 http://www.xy101.com/100-100-100.html 跳转到http://www.xy101.com页面。


(5)基于目录下所有 php 结尾的文件跳转

要求访问 http://www.xy101.com/upload/123.php 跳转到首页。
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;
    
    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.xy101.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}


systemctl restart nginx
浏览器访问 http://www.xy101.com/upload/123.php 跳转到http://www.xy101.com页面。


(6)基于最普通一条 url 请求的跳转

要求访问一个具体的页面如 http://www.xy101.com/abc/123.html 跳转到首页
vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xy101.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xy101.com-access.log;
    
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.xy101.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}


systemctl restart nginx
浏览器访问 http://www.xy101.com/abc/123.html 跳转到http://www.xy101.com页面。

习题:

(1)将请求http://www.xy101.com/abc/123.html 跳转到首页http://www.xy101.com

location ~* ^/abc/123.html {rewrite (.+) http://www.xy101.com permanent;}


(2)将请求http://www.xy101.com/abc/test.jpg 跳转到http://www.xy101.com/error.png

location ~* ^/abc/test.jpg$ {rewrite ^/ /error.png premanent;}


(3)将请求http://www.xy102.com/discuz/index.php 跳转到http://www.xy101.com/discuz/index.php ,保证原域名后面的uri路径不变

if ($host = "www.xy102") {rewrite ^/(.*) http://www.xy101.com/$1 premanent;}


(4)将请求http://discuz.xy101.com/index.php 的访问跳转到http://www.xy101.com/discuz/index.php ,保证原域名后面的uri路径不变

if ($host = "discuz.xy101.com") {rewrite ^/(.*) http://www.xy101.com/discuz/$1 permanent;}


(5)将对http://www.xy101.com 网站的所有请求跳转到自定义的维护页面或图片,本地可以访问

set $rewrite true;
if ($remote_add = "本机ip") {set $rewrite false;}
if ($rewrite = true) {rewrite ^/weihu.html;}
location = /weihu.html {root = /维护的文件地址}

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

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

相关文章

家宽动态公网IP,使用docker+ddns 实现动态域名解析

官方地址&#xff1a;https://github.com/jeessy2/ddns-go 安装docker docker pull jeessy/ddns-godocker run -d --name ddns-go --restartalways --nethost -v /opt/ddns-go:/root jeessy/ddns-go然后访问ip端口 配置时注意如下

pytorch+YOLOv8-1

1.工具开发 2.idea配置pytorch环境 默认安装新版本torch pip install torch 3.pytorch验证 4. print(torch.cuda.is_available()) 输出结果为 False 说明我只能用cpu

有关RIPv2认证技术与网络安全综合实验

有关RIPv2认证技术与网络安全综合实验 实验拓扑如下&#xff1a; 理论知识&#xff1a; 比较 RIPv1&#xff1a;广播式通信&#xff0c;255.255.255.255&#xff1b;不支持认证&#xff0c;有类不带掩码&#xff1b;不支持VLSM和CIDR RIPV2&#xff1a;组播通信&#xff0c;22…

【Matplotlib作图-4.Distribution】50 Matplotlib Visualizations, Python实现,源码可复现

目录 04 Distribution 4.0 Prerequisite 4.1 连续变量的直方图(Histogram for Continuous Variable) 4.2 分类变量的直方图(Histogram for Categorical Variable) 4.3 Density Plot 4.4 Density Curves with Histogram 4.5 Joy Plot 4.6 Distributed Dot Plot 4.7 Box P…

详解和实现数据表格中的行数据合并功能

theme: smartblue 前言 需求场景&#xff1a; 在提供了数据查看和修改的表格视图中(如table、a-table等…)&#xff0c;允许用户自行选择多行数据&#xff0c;依据当前状态进行特定列数据的合并操作。选中的数据将统一显示为选中组的首条数据值。同时&#xff0c;页面会即时反…

插入排序(直接插入排序与希尔排序)----数据结构-排序①

1、插入排序 1.1 插入排序的基本思想 将待排序的元素按其数值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的元素插入完为止&#xff0c;就可以得到一个新的有序序列 。 实际上在我们的日常生活中&#xff0c;插入排序的应用是很广泛的&#xff0c;例如我…

二分查找算法介绍(边界值、循环条件、值的变化、二分查找的原理、异常处理)

一、二分查找法原理介绍 二分查找是经典的查找算法之一&#xff0c;其原理也非常简单。 对于已排序的数组&#xff08;假设是整型&#xff0c;如果非整型&#xff0c;如果有排序和大小比较的定义&#xff0c;也可以使用二分查找&#xff09;&#xff0c;我们每次判断中间值与目…

Golang TCP网络编程

文章目录 网络编程介绍TCP网络编程服务器监听客户端连接服务器服务端获取连接向连接中写入数据从连接中读取数据关闭连接/监听器 简易的TCP回声服务器效果展示服务端处理逻辑客户端处理逻辑 网络编程介绍 网络编程介绍 网络编程是指通过计算机网络实现程序间通信的一种编程技术…

三十五、openlayers官网示例Dynamic Data——在地图上加载动态数据形成动画效果

官网demo地址&#xff1a; Dynamic Data 初始化地图 const tileLayer new TileLayer({source: new OSM(),});const map new Map({layers: [tileLayer],target: "map",view: new View({center: [0, 0],zoom: 2,}),}); 创建了三个样式 const imageStyle new Style(…

黑马微服务实用篇知识梳理

1、微服务治理 1.1服务注册与发现Eureka和Nacos a、nacos和eureka&#xff0c;二者都支持服务注册与发现&#xff0c;但nacos还包括了动态配置管理、服务健康监测、动态路由等功能&#xff0c;是更全面的服务管理平台 b、eureka需要独立部署为服务并运行&#xff0c;需要自行搭…

师彼长技以助己(3)逻辑思维

师彼长技以助己&#xff08;3&#xff09;逻辑思维 前言 上一篇文章进行了工程思维和产品思维的测试&#xff0c;并介绍了几个比较重要的产品思维模型。接下来本篇介绍工程思维。&#xff08;注意产品思维并不代表产品经理思维&#xff0c;工程思维也并不代表工程师思维&…

【用户画像】用户偏好购物模型BP

一、前言 用户购物偏好模型BP&#xff08;Buyer Preferences Model&#xff09;旨在通过对用户购物行为的深入分析和建模&#xff0c;以量化用户对不同商品或服务的偏好程度。该模型对于电商平台、零售商以及其他涉及消费者决策的商业实体来说&#xff0c;具有重要的应用价值。…

linux,lseek,append用法

打开写的.c文件 内容为 代码 <sys/stat.h> #include <fcntl.h> #include<stdio.h> #include<unistd.h> #include<string.h>//off_t lseek(int fd, off_t offset, int whence); //int open(const char *pathname, int flags); //int open(const …

二类电商想做爆品还是得会选品

对于二类电商&#xff0c;尤其是电商新手而言&#xff0c;往往很多人都不知道自己该如何选品&#xff0c;在哪里选品&#xff0c;以及如何谈品等等的难题。想要挑选具有潜力的商品&#xff0c;首先我们需要梳理好商品选择的逻辑&#xff1a; 二类电商的特点&#xff1f;你要投…

装机必备——360驱动大师安装教程

装机必备——360驱动大师安装教程 软件下载 软件名称&#xff1a;360驱动大师2.0beta 软件语言&#xff1a;简体中文 软件大小&#xff1a;13.87M系统要求&#xff1a;Windows7或更高&#xff0c; 32/64位操作系统 硬件要求&#xff1a;CPU2GHz &#xff0c;RAM2G或更高 下载…

36【Aseprite 作图】蒸笼盖——拆解

1 蒸笼盖框架 里圈和外圈的形状都是一样的 扶手处&#xff0c;2 1 2 2 2&#xff08;最好都是2&#xff0c;拐角处用1&#xff09; 2 上色 中间的波浪&#xff0c;是2 2 2 上&#xff08;再 2 2 2 下&#xff09; 下方阴影&#xff0c;左边的阴影&#xff0c;右边的阴影颜色…

React@16.x(18)错误边界

目录 1&#xff0c;什么是错误边界2&#xff0c;捕获子组件的错误2.1&#xff0c;static getDerivedStateFromError2.1.1&#xff0c;特点2.1.2&#xff0c;举例 2.2&#xff0c;componentDidCatch2.2.1&#xff0c;特点2.2.2&#xff0c;举例 3&#xff0c;错误边界组件无法捕…

冯喜运:6.3黄金原油晚间最新行情及独家操作策略指导

【黄金消息面分析】&#xff1a;在全球经济的波动和不确定性中&#xff0c;黄金作为传统的避险资产&#xff0c;其价格走势和市场分析一直是投资者关注的焦点。本周一&#xff08;北京时间6月3日&#xff09;&#xff0c;现货黄金价格基本持平&#xff0c;交易商正在等待本周公…

一个AI板卡电脑--香橙派 AIpro

本文算是一个开箱测评&#xff0c;主要评估它和一个电脑的距离。 香橙派官网&#xff1a;香橙派(Orange Pi)-Orange Pi官网-香橙派开发板,开源硬件,开源软件,开源芯片,电脑键盘香橙派&#xff08;Orange Pi&#xff09;是深圳市迅龙软件有限公司旗下开源产品品牌;香橙派&#x…

c#控件笔记

c# PictureBox在工具箱的哪个位置 在 Visual Studio 的工具箱中&#xff0c;PictureBox 控件位于 “Common Controls” 部分。要找到 PictureBox&#xff0c;请按照以下步骤操作&#xff1a; 打开 Visual Studio 并加载您的项目。确保已经打开了设计器视图&#xff08;即您的…