资讯详情

41Nginx Rewrite

Nginx Rewrite

常用的Nginx 正则表达式

匹配符 表示含义
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除“\n如果要匹配任何其他单个字符,则包括\n任何字符,包括
\ 将后面的字符标记为特殊字符或原义字符或向后引用
\d 匹配纯数字
{n} 重复 n 次
{n,} 重复 n 次或更多次
{n,m} 重复 n 到 m 次
[] 定义匹配的字符范围
[c] 匹配单个字符 c
[a-z] 匹配 a-z 任何一个小写字母
[a-zA-Z0-9] 匹配所有大大小小的字母或数字
() 表达式的开始和结束位置
| 或运算符

location

location大致可分为三类: 精准匹配:location = / {…} 一般匹配:location / {…} 正则匹配:location ~ / {…}

常用的匹配规则

= 准确匹配普通字符,即完全匹配
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再与其他字符匹配。location。
~ 区分大小写的匹配。
~ * 大小写的匹配没有区别。
!~ 区分大小写的匹配取非。
!~* 不区分大小写的匹配取非。

优先级

首先,准确匹配 = 其次,前缀匹配 ^~ 二是文件中顺序的正则匹配 * 然后匹配没有任何修改的前缀 最后是交给 / 通用匹配

优先级总结

(location = 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /) 先看优先级:准确>前缀>正则>一般>通用 优先级相同:正则看上下顺序,以上优先:一般匹配看长度,最长匹配优先,准确、前缀、正则,一般不匹配,最后看一般匹配。

在实际网站使用中,至少有三个匹配规则: 第一条必选规则 直接匹配网站根部,通过域名频繁访问网站首页,使用会加速处理,比如官网。 可以是静态主页,也可以直接转发给后端应用服务器 location =/{

root html; index index.html index.htm;}

#第二个必选规则是处理静态文件请求,这是nginx作为http服务器的优势 目录匹配或后缀匹配有两种配置模式,可选择一种或搭配使用 location ^~ /static/{ root /webroot/static/;}

/static/

location ~* \ .(htmllgifljpgljpeglpnglcssljslico)${ root /webroot/res/;}

#第三条规则是一般规则,如转发带.php、.jsp动态请求后端应用服务器 非静态文件请求默认为动态请求 location / proxy pass http://tomcat server:

rewrite

从功能看rewrite和location看起来有点像跳转,主要区别在于rewrite在同一域名中改变获取资源的路径,location也可以控制访问或反向代理一类路径proxy pass去别的机器。

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

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

rewrite跳转实现

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-oL45nxN9-1658814012829)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220722111833184.png)]

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

rewrite 执行顺序如下

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

语法格式

[外链图片存储失败,源站可能有防盗链机制,建议保存图片直接上传(img-Gnrd8yy1-1658814012830)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220722114459742.png)]

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

last :本规则匹配完成后,继续向下匹配新规则location URL一般用于规则 server 和 if 中。 break :本规则匹配完成后终止,不再匹配以下任何规则,一般用于 location 中。 redirect :返回302临时重定向,浏览器地址显示跳转后URL地址。 permanent :返回301永久重定向,浏览器地址栏显示跳转后URL地址。

基于域名的跳转

现在公司I旧域名ww.kgc.com业务需求变更需要使用新域名www. benet.com但是旧域名不能废除,需要跳转到新域名,后面的参数保持不变。

vm /usr/local/nginx/conf/nginx.conf
server{
listen 80;
server_name www.syw.com; 	#域名修改
charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;	#日志修改
location  / {	#添加域名重定向
if ($host='www.syw.com'){	#$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.xjw.com/$1 permanent;	#$1为正则匹配的内容,即"域名/"之后的字符串
root	html;
index	index.html index.htm;}
}
mkdir /var/log/nginx
systemctl restart nginx
echo "192.168.247.150 www.syw.com www.xjw.com" >> /etc/hosts

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nMBuicZ-1658814012830)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725142205503.png)]

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

基于客户端IP访问跳转

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

vim /usr/local/nginx/conf/nginx.conf
server{
listen 80;
server_name www.syw.com;	#域名修改
charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;	#日志修改
设置是否合法的IP标记
set $rewrite true;	#设置变量$rewrite,变量值为true
判断是否为合法IP
if($remote_addr="192.168.247.143"){	#当客户端IP为192.168.10.19时,将变量值设为false,不进行重写
set $rewrite false;}	#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite=true){	#当变量值为true时,进行重写
rewrite (.+)/weihu.html;	#将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html
}
location =/weihu.html{
root /var/www/html;		#K网页返回/var/www/html/weihu.html的内容
}
location /{
root html;
index index.html index.htm;
}
mkdir -p /var/www/html/
echo "<hl>We are maintaining now!</h1>">/var/www/html/weihu.html
systemctl restart nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4qch6g5D-1658814012831)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725150207043.png)]

只有IP为192.168.247.143能正常访问,其它地址都是维护页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mKpqtLsr-1658814012831)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725145216420.png)]

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

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

vim /usr/local/ginx/conf/nginx.conf
server{
listen 80:
server name www.syw.com; #域名修改
charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;
location /post{
rewrite (.+) http://www.kgc.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 test" >> /usr/local/nginx/html/bbs/post/1.html
echo "192.168.10.19 bbs.kgc.com" >> /etc/hosts
systemctl restart nginx

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n92QIPbk-1658814012831)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725152057611.png)]

使用浏览器访问http: //bbs,syw,com/post/1.html跳转到http: //www,syw,com/bbs/post1.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NysQlgDp-1658814012832)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725151737220.png)]

基于参数匹配的跳转

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

vim /usr/local/nginx/conf/nginx.conf
server{
listen 80;
server name www.syw.com;	#域名修改
charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;
if ($request uri ~/100-(100|200)-(\d+).htmls){
或者 location ~ /100-(100|200)-(\d+).html$ {
rewrite(.+)http://ww,kgc,com permanent;}
location /{
root html;
index index.html index.htm;
}

$request_uri:包含请求参数的原始URI,不包含主机名。 $uri:这个变量指当前的请求URI,不包括任何参数。 document uri:与uri相同,这个变量指当前的请求URI,不包括任何传递参数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zKS2TvmV-1658814012832)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725163554218.png)]

使用浏览器访问http: //www,syw,com/100-100-1.html跳转到http: //www,syw,com

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvgzNBxt-1658814012833)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725162222835.png)]

基于 目录下所有的php文件

要求访问 http 😕/www. syw.com/upload/123.php 跳转到首页

vim  /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  www.syw.com;
          charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;
   location ~* /upload/.*\.php$ {
       rewrite (.+) http://www.syw.com permanent;
   }
    location / {
        root   html;
        index  index.html index.htm;
    }  
systemctl restart nginx	#重启服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nwFmgVJ-1658814012833)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725165053105.png)]

在网页测试http 😕/www .syw.com/upload/123.php

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eu20YEf0-1658814012833)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725165231999.png)]

基于普通的一条url

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

server {
    listen       80;
    server_name  www.syw.com;
	charset utf-8;
access_log /var/log/nginx/www.syw.com-access.log;
location ~* ^/abc/123.html$ {
  rewrite (.+) http://www.syw.com permanent;   }
  location / {
    root   html;
    index  index.html index.htm;
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5Y1eHAo-1658814012833)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725165554782.png)]

在网页测试http 😕/www. syw.com/abc/123.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eka0JPhj-1658814012834)(C:\Users\灰灰\AppData\Roaming\Typora\typora-user-images\image-20220725165608559.png)]

og; location ~* ^/abc/123.html$ { rewrite (.+) http://www.syw.com permanent; } location / { root html; index index.html index.htm; }

[外链图片转存中...(img-D5Y1eHAo-1658814012833)]

在网页测试http ://www. syw.com/abc/123.html 

[外链图片转存中...(img-Eka0JPhj-1658814012834)]

标签: syw二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台