我的编程空间,编程开发者的网络收藏夹
学习永远不晚

nginx Rewrite重写地址的实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

nginx Rewrite重写地址的实现

一、Nginx正则表达式

常用的正则表达式元字符

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
匹配前面的字符零次或一次
.匹配除“\n”之外的任何单个字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d匹配纯数字
{n}重复n次
{n,m}重复n次或更多次
[ ]定义匹配的字符范围
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或A-Z大写字母的任意一个
()表达式的开始和结束位置
l或运算符

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

二、location

2.1、location大致可以分为三类

  • 精确匹配:location = / { … }
  • 一般匹配:location / { … }
  • 正则匹配:location ~ / { … }

2.2、 location 常用的匹配规则

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

2.3、 location优先级

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

2.4、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 {}    www.baidu.com
匹配任何以 /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 /)

2.5、location 匹配

  • 首先看 优先级:精确>前缀>正则>一般>通用
  • 优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
  • 精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配

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

1.第一个必选规则

  • 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
  • 可以是一个静态首页,也可以直接转发给后端应用服务器
location = / {
    root   html;
	index  index.html index.htm;
}

2.第二个必选规则

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

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

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

3.第三个规则

就是通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器

非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}

三、rewrite

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。

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

URL:就是具体路径/位置
URl:指的是一个拥有相同类型/特性的对象集合

3.1、rewrite跳转实现

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

3.2、rewrite执行顺序

  • 执行 server 块里面的 rewrite 指令。
  • 执行 location 匹配。
  • 执行选定的 location 中的 rewrite 指令。

3.3、语法格式

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

3.4、flag标记说明

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

四、rewrite 示例

4.1、基于域名的跳转

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

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

server {
    listen       80;
    server_name  www.gc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.gc.com.access.log;
    location / {
        if ($host = 'www.gc.com'){
            rewrite ^/(.*)$ http://www.qqq.com/$1 permanent;
        }
        root   html;
        index  index.html index.htm;
    }
}

echo "192.168.132.6 www.gc.com www.qqq.com" >> /etc/hosts
mkdir -p /var/log/nginx/

systemctl restart nginx
cd /usr/local/nginx/html/test
vim 1.html

将对应的ip和域名写入etc下hosts文件

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

4.2、基于客户端 IP 访问跳转

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

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

	#设置是否合法的IP标记
    set $rewrite true;							#设置变量$rewrite,变量值为boole值true
    #判断是否为合法IP
	if ($remote_addr = "192.168.190.52"){		#当客户端IP为192.168.190.52时,将变量值设为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;						#网页返回/var/www/html/weihu.html的内容
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}


mkdir -p /var/www/html/
echo "<h1>正在维护!!!等会再来</h1>" > /var/www/html/weihu.html
systemctl restart nginx

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

换一个台服务器访问 显示 访问失败

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

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.gc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.gc.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.gc.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.190.52 bbs.gc.com www.gc.com"  >> /etc/hosts
systemctl restart nginx

http://bbs.gc.com/post/1.html 跳转到 http://www.gc.com/bbs/post/1.html

4.4、基于参数匹配的跳转

现在访问http://www.gc.com/100-(100|200)-100(任意数字).html 跳转到http://www.gc.com页面。

vim /usr/local/nginx/conf/nginx.conf
server {
    listen       80;
    server_name  www.gc.com;
    charset utf-8;
    access_log  /var/log/nginx/www.gc.com.access.log;

    if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.gc.com permanent;
    }

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

echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx

浏览器访问
http://www.gc.com/100-200-100.html 或 
http://www.gc.com/100-100-100.html 跳转到http://www.gc.com页面。

4.5、基于目录下所有 php 结尾的文件跳转

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

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

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

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

echo "192.168.190.52 www.gc.com" >> /etc/hosts
systemctl restart nginx

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

4.6、基于最普通一条 url 请求的跳转

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

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

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

systemctl restart nginx

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

五、总结

本章内容讲述了Rewrite跳转实现、nginx中正则的表达方法以及关于location的匹配。更多相关nginx Rewrite重写地址内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

nginx Rewrite重写地址的实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

详解常用的nginx rewrite重写规则

在Nginx中,rewrite指令用于重写URL。它允许用户修改请求URI、查询参数以及HTTP请求方法。以下是常用的Nginx rewrite重写规则:1. 重写URI:- 重写到固定URI:rewrite ^/old-uri$ /new
2023-08-14

常用的nginx rewrite重写规则有哪些

常用的nginx rewrite重写规则有以下几种:1. 重定向:- 将所有请求重定向到一个新的URL:`rewrite ^/(.*)$ http://newdomain.com/$1 permanent;`- 将只有特定路径的请求重定向到
2023-08-14

Nginx中location匹配及rewrite重写跳转的方法

这篇文章主要介绍“Nginx中location匹配及rewrite重写跳转的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Nginx中location匹配及rewrite重写跳转的方法”文章能帮
2023-06-29

Nginx如何实现URL重写规则配置

这篇文章主要介绍了Nginx如何实现URL重写规则配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。rewrite模块介绍nginx的重写模块是一个简单的正则表达式匹配与一个
2023-06-04

IIS7中Web.config的rewrite实例分析讲解,教你看懂重写规则

这篇文章详细介绍解释了IIS7Web.configrewrite规则设置url重写功能,通过讲解实例的语法结构和标签用法,搭配一些简单的正则表达式,你可以写出符合自己要求的重写规则。
2022-11-21

Centos7.5配置IP地址的实现

1.配置ip地址前首先ifconfig查看网卡信息并获取到网卡的名称2.进入到网卡配置目录 cd /etc/sysconfig/network-scripts/,找到配置文件为ifcfg-em23.修改ifcfg-em2,为如下:TYPE=
2022-06-04

android 获取本机的IP地址和mac物理地址的实现方法

获取本机IP地址public String getLocalIpAddress() { WifiManager wifiManager = (WifiManager) getSystemService(android.content.Con
2022-06-06

Android 获取IP地址的实现方法

Android 获取IP地址 最近做项目,有一个需求是Android设备获取当前IP的功能,经过一番查询资料解决了,记录下实现方法。 1.使用WIFI 首先设置用户权限2022-06-06

Win8使用IE10转到复制的地址功能实现复制网址到地址栏

如果我们需要在另一个浏览器打开同一个网站,一般复制网址到地址栏,再回车或点击地址栏右侧的“转至”来实现。在Win8的IE10浏览器中,可以使用“转到复制的地址”功能来实现。如何操作呢?在复制某
2022-06-04

Python中实现ipaddress网络地址的处理

目录前言地址网络打印网络地址有多少IP可用接口前言 ipaddress库提供了处理IPv4与IPv6网络地址的类。这些类支持验证,查找网络上的地址和主机,以及其他常见的操作。 本篇,将详细介绍Python中ipaddress库的使用规则。(
2022-06-02

java如何实现接口中的重写

普通类implements接口1、普通方法,抽象方法都得重写;2、默认方法可重写,也可不重写。抽象类implements接口在线视频教程分享:java教学视频由抽象类来实现接口,则不必重写接口的方法。可以全部不重写或只重写一部分方法。public interf
java如何实现接口中的重写
2018-08-23

编程热搜

目录