Linux NGINX服务 ReWrite^location

news2024/11/25 4:54:17

 ReWrite^location

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

rewrite 对访问的域名或者域名内的URL路径地址重写
location 匹配访问路径,对访问的路径做访问控制或者代理转发

常用的Nginx 正则表达式

^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d匹配纯数字[0-9]         \D 取反
\s空白符        \S取反
\w任意单词字符包括下划线[A-Za-z0-9_]        W取反
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
[ ]定义匹配的字符范围
[^ ]方括号内加^表示取反
[c]匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
()代表一个整体(abc)表达式的开始和结束位置
|或运算符

---------------------location-------------------------

location 大致可以分为三类

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

location 常用的匹配规则

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

location 优先级

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

location 示例说明

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

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

访问www.xue.com/abc/123/QWE/789.html

location /abc 

location /abc/123

location /abc/123/QWE

当匹配到第一条不会结束,继续匹配。这里/abc/123/QWE最长能匹配上域名,取最后一条

但若存在location/abc/123/QWE/789.html 精确匹配优先级最高,选择这一项(但是必须完全一致精准匹配才能匹配上)

(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 匹配 
首先看 优先级:精确= > 前缀^~ > 正则~,~* > 一般 > 通用/

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

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

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

实际网站使用中,至少有三个匹配规则定义

第一个必选规则  精准匹配 首页

直接匹配网站根目录首页,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
可以是一个静态首页,也可以直接转发给后端应用服务器

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

第二个必选规则  前缀/正则/通用匹配 静态页面

处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

location ^~ /static/ {
    root /webroot/;
}

location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

#location / { #这里通用匹配注释不用,留给下面的动态页面使用。如果动态页面使用正则匹配,这里不用注释
#    root html;
#}

第三个必选规则 动态页面 默认匹配或者和静态页面一样使用正则匹配

通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
若非静态文件请求就默认是动态请求,默认匹配 上面静态页面匹配第三条不写默认匹配

location / {
    proxy_pass http://tomcat_server;
}

 若动态页面也使用正则匹配(更加精确)上面静态页面匹配第三条可以写默认匹配 一般用这个比较好

location ~ .*\.php$ {
    root /php;
}

location ~ .*\.jsp$ {
    root /java;
}

​​​​


---------------------rewrite-------------------------

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

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.xue.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

rewrite跳转实现

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

rewrite 执行顺序如下

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

语法格式

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。

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

全路径重写 

默认情况下rewrite从域名后  根目录到参数的?前  重写,若要全路径重写,加上完整的协议和域名

rewrite ^/ http://www.xue.com/error.png

1.基于域名的跳转

现在公司旧域名www.xue.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;        #日志修改
    location / {
    #添加域名重定向
        if ($host = 'www.xue.com'){
#$host为rewrite全局变量,代表请求主机头字段或主机名 如果请求的是www.xue.com
            rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
#使用正则表达式匹配,匹配到根目录后(.*)$任意结尾转换为benet域名下相同路径($1代表前面第一个括号内的内容,这里为正则表达式匹配到的路径,即“域名/”之后的字符串)
#这里相当于将前面域名转换为后面域名加上要访问的目录
        }
        root   html;
        index  index.html index.htm;
    }
}
echo "192.168.80.101 www.xue.com www.benet.com" >> /etc/hosts
systemctl restart nginx


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

2.于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.101访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;        #日志修改

    #设置是否合法的IP标记
    set $rewrite true;                            #设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
    if ($remote_addr = "192.168.80.101"){        #当客户端IP为192.168.80.101时,将变量值设为false,不进行重写
        set $rewrite false;
    }
    #除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){             #当变量值为true时,进行重写
        rewrite (.+) /weihu.html;     
        #这里并不匹配特定字符并将其作为替换参数 而是直接全部替换 所以这里正则表达式没用可以随便写 写^/  ^~  ~/都行 
        #将域名后边的路径重写成/weihu.html后转发,例如www.xue.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.101 能正常访问,其它地址都是维护页面

 

--------------------------------------------------------

不要加permanent参数!

如果rewrite (.+) /weihu.html; 换成rewrite (.+) /weihu.html permanent; 的话,

若不是 192.168.80.101 的主机访问会使浏览器修改请求访问的 URL 成 http://www.xue.com/weihu.html 再请求访问,由于这次只匹配源IP,而不是域名,每次请求的IP都一样,这样就会进入一直在 rewrite 的死循环
--------------------------------------------------------

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

现在访问的是 http://bbs.xue.com/test/,现在需要将这个域名下面的访问都跳转到http://www.xue.com/bbs/test/

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  bbs.xue.com www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;
    #添加
    location /test {
        rewrite (.+) http://www.xue.com/bbs$1 permanent;   
#这里的(.+)前没有/,匹配到的内容会包含根目录的/,所以后面的$1前也没写/ 。
#如果按实例1的 ^/(.*)$,以斜杠开头,不包含斜杠,后面就得加一个斜杠。正则表达式的写法注意。
#这里的$1为位置变量,代表/test。访问/bbs.xue.com/test/,获取test,重写域名并拼接到写的域名后
    }
    
#    location /bbs {
#        root   /var/www;
#    }
#若加上此条,在第一次重写完地址后,浏览器再次访问/bbs/test,此时匹配上这条/bbs,可以起到更改网页路径的作用。
#如果这条启用,网页就要移动到/var/www/test下


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

由于重写网站为http://www.xue.com/bbs,访问的是http://www.xue.com/bbs/test,所以网页目录要在/usr/local/nginx/html/bbs/test/

mkdir -p /usr/local/nginx/html/bbs/test
echo "this is 1.html" >> /usr/local/nginx/html/bbs/test/1.html
echo "192.168.80.101 bbs.xue.com"  >> /etc/hosts
systemctl restart nginx


使用浏览器访问 http://bbs.xue.com/test/1.html 跳转到 http://www.xue.com/bbs/test/1.html

 

4.基于参数匹配的跳转

现在访问http://www.xue.com/100-(100|200)-100.html 跳转到http://www.xue.com页面。

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;
#写法1 server中用if判断配合全局变量重写
    #if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {  # ~代表正则匹配
    if ($uri ~ ^/100-(100|200)-(\d+).html$) { #后面有传参用uri。没有传参用$request_uri也行
        rewrite (.+) http://www.xue.com permanent; #全链重写,不加参数,正则表达式随便写
    }
#写法2 location中直接匹配重写 ^/ html$ 开头/结尾html
#www.xue.com/100-(100|200)-100.html重写为www.xue.com
    location ~ ^/100-(1|2)00-100\.html$ {
        rewrite (.+) http://www.xue.com permanent;
    }
#写法3 location中直接匹配重写 .*匹配前面所有
#www.xue.com/xxxxxx/100-(100|200)-100.html重写为www.xue.com
    location ~ .*/100-(1|2)00-100\.html$ {
        rewrite (.+) http://www.xue.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}
  • $request_uri       包含请求参数的原始URI,不包含主机名,如:http://www.xue.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.xue.com/100-200-100.html 或 http://www.xue.com/100-100-100.html 跳转到http://www.xue.com页面。 

 

 

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

要求访问 http://www.xue.com/upload/123.php 跳转到首页。

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;
    
    location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.xue.com permanent;
    }

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

systemctl restart nginx


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

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

要求访问一个具体的页面如 http://www.xue.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf

server {
    listen       80;
    server_name  www.xue.com;        #域名修改    
    charset utf-8;
    access_log  /var/log/nginx/www.xue.com-access.log;
    
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.xue.com permanent;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }
}
systemctl restart nginx

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


 

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

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

相关文章

Nginx正则表达式、location匹配、Rewrite重写详解

Nginx正则表达式、location匹配、Rewrite重写详解 一、常用的Nginx正则表达式二、location匹配概述1、location大致可以分为三类2、location常用的匹配规则3、location 优先级4、location 示例说明5、实际网站使用中&#xff0c;至少有三个匹配规则定义 三、rewrite重写1、rewr…

果推断16--基于反事实因果推断的度小满额度模型学习笔记

目录 一、原文地址 二、一些问题 2.1如何从RCT随机样本过渡到观测样本因果建模&#xff1f; 2.2反事实学习的核心思想 2.3度小满的连续反事实额度模型 Mono-CFR 2.4Mono-CFR代码实现&#xff08;待补充&#xff09; 2.5CFR学习 2.5.1CFR 2.5.2DR-CFR 参考 一、原文地…

Spring Cloud Alibaba — Nacos 构建服务注册中心

文章目录 Nacos Server下载启动登录创建命名空间 Nacos Client启动样例Nacos 服务发现配置项 集成 OpenFeign 远程接口调用添加 OpenFeign 依赖开启 EnableFeignClients 注解编写远程服务接口远程接口调用 集成 Sentinel 熔断降级添加 Sentinel 依赖开启 Sentinel 熔断降级编写…

【数据结构每日一题】链表——单链表重排

[数据结构习题]链表——单链表重排 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——顺序存储 &#x1f449;知识点导航&#x1f48e;&#xff1a;【数据结构】线性表——链式存储 &#x1f449;[王道数据结构]习题导航&#x1f48e;&#xff1a; p …

pr安装缺少VCRUNTIME140.dll怎么办?这三个修复方案可以解决

在我们安装pr的时候&#xff0c;遇到缺少VCRUNTIME140.dll怎么办&#xff1f;vcruntime140.dll是一个Windows动态链接库&#xff0c;其主要功能是为C/C编译的程序提供运行时支持。这些库包括输入/输出函数、数学函数、字符串函数等等。因此&#xff0c;如果您的计算机缺少vcrun…

【接口自动化测试】一步一步教你搭建接口环境

要做接口测试&#xff0c;我们得搭建一套本地可以运行的接口环境。这次我选择了一个搭建容易&#xff0c;适合学习的系统——学生管理系统。 Python安装 这套管理系统是Python代码写的&#xff0c;因此需要Python环境。 安装挺无脑的&#xff0c;按照我提供的安装包和方法装…

windows下PC端小程序抓包--FiddlerCharles

目录 引言 【背景说明】 【操作说明】 【总结】 引言 大家好&#xff0c;你是否曾经遇到过想要抓取Windows下PC端小程序的网络请求数据&#xff0c;但不知道该用什么工具呢&#xff1f; 今天我要介绍的Fiddler和Charles两款工具&#xff0c;可帮助你轻松切入小程序网络请…

MySQL数据库 7.图形化界面工具DataGrip基础应用教学

目录 前言&#xff1a; DataGrip安装界面&#xff1a; 利用DataGrip创建数据库&#xff1a; 利用DataGrip为数据库创建表&#xff1a; 利用datagrip修改表&#xff1a; 添加元素&#xff1a; 结束&#xff01; 前言&#xff1a; 在之前我们一直接触的是MySQL命令行语句开…

4.3 最优装载

博主简介&#xff1a;一个爱打游戏的计算机专业学生博主主页&#xff1a; 夏驰和徐策所属专栏&#xff1a;算法设计与分析 1.什么是贪心算法的最优装载问题&#xff1f; 最优装载问题&#xff08;Bin Packing Problem&#xff09;是一个经典的组合优化问题&#xff0c;涉及将一…

【Linux】-编译器-gcc/g++使用以及动态库和静态库的介绍(以及解决sudo失败的方法)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点…

iOS证书(.p12)和描述文件(.mobileprovision)申请

目录 iOS证书(.p12)和描述文件(.mobileprovision)申请文末扩展&#xff08;UDID获取、添加测试设备&#xff09; 说明&#xff1a;本文申请证书、描述文件转载自 uniapp官网   iOS证书(.p12)和描述文件(.mobileprovision)申请      官网会时不时更新&#xff0c;如有疑问&…

《Apollo 智能驾驶进阶课程》二、 高精地图

1. 高精地图与自动驾驶的关系 1.1 高精地图与自动驾驶 L3级别以上才需要高精地图 1.2 什么是高精地图 1.3 高精地图与导航地图 1.4 高精地图-基础模块 高精地图与定位模块的关系 现在主流的自动驾驶的定位方案有两种&#xff1a;一种是基于点云&#xff0c;另一种是基于C…

投票系统(前后端分离)

1.投票系统的介绍 投票系统是一种用于组织选举和投票的软件系统&#xff0c;它可以帮助政府、企业、组织和社区等各种机构进行公正、透明和高效的投票活动。投票系统的主要功能包括&#xff1a;选民身份验证、投票管理、计票和结果公布等。 选民身份验证是指投票系统可以通过…

SpringCloud Sleuth/Zipkin学习

SpringCloud Sleuth/Zipkin 文章目录 SpringCloud Sleuth/Zipkin1 Sleuth/Zipkin 简介2 Sleuth/ZipKin-搭建链路监控实例 1 Sleuth/Zipkin 简介 在微服务框架中&#xff0c;一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用, 来协同产生最后的请求结果&…

电脑右键删除的文件如何恢复?提供了4种方法

电脑上不小心删除文件是很常见的一件事。比如在使用右键删除的情况下&#xff0c;但是&#xff0c;误删并不代表永远丧失这个文件&#xff0c;因为我们可以通过一些方法来恢复右键删除的文件。本文提供了4种方法&#xff0c;你可以根据具体的数据丢失情况选择合适的方法。 方法…

【Python】列表 List ③ ( 查询操作 / 修改操作 | 列表查询操作 List#index | 修改列表指定位置元素值 )

文章目录 一、列表查询操作1、List#index 函数简介2、代码示例 - 列表查询3、列表查询 ValueError 报错 二、修改列表指定索引元素1、语法简介2、代码示例 - 使用正向 / 反向索引修改指定元素 一、列表查询操作 1、List#index 函数简介 列表 List 查询功能 , 通过 List#index 函…

PyTorch 深度学习 || 专题一:神经网络基础

神经网络基础 神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。学习神经网络不仅可以让你掌握一门强大的机器学习方法&#xff0c;同时也可以更好地帮助你理解深度学习技术。 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器…

【JAVA】双向链表详解

【JAVA】双向链表详解 双向链表的定义双向链表的初步实现&#xff08;准备&#xff09;双向链表的操作一. 打印链表二. 得到链表长度三. 插入操作3.1 头插法3.2 尾插法3.3 任意位置插入 四. 删除操作4.1 删除第一次出现为key的节点&#xff08;3种情况&#xff09;4.2 删除所以…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(四)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

保姆级别ps bate版本下载

前言&#xff1a;最近的ps bete版本在抖音也是上了热搜&#xff0c;时不时就能刷到一个&#xff0c;相信大家也知道ai带来的魅力&#xff0c;真的很强&#xff0c;那我们就开始安装教程吧。 ​过程&#xff1a; 先打开链接&#xff1a;Adobe Creative Cloud | Details and pr…