系统相关
首页 > 系统相关> > Nginx 重写(location / rewrite)

Nginx 重写(location / rewrite)

作者:互联网

Nginx 重写(location / rewrite)

目录

常见的nginx正则表达式

^ 匹配输入字符串的起始位置(已什么开头)。
$ 匹配输入字符串的结束位置(已什么结尾)。
* 匹配前面的字符零次或多次。如"01*"能够匹配到"0"、"01"、"011"、"0111......."。
+ 匹配前面的字符一次或多次。如"01*"能够匹配到"01"、"011"、"0111......."。
? 匹配前面字符零次或一次。如01?只能能够匹配到"0"、"01"。
. 匹配除”\n“之外的任意一个字符,若要匹配包括”\n“在内的任意字符则使用”[.\n]“之类的表达式
\ 转义符
\d 匹配出数字效果于[0-9]一致
\s 空白符
\w 任意单词字符包括下划线
{n} 匹配前面表字符n次
{n,} 匹配前面字符不少于n次
{n,m} 匹配前面字符n到m次
[] 定义匹配的字符范围
[c] 匹配单个字符c
[a-z] 匹配a-z小写字母任意一个
[a-zA-Z0-9] 匹配范围大小写字母及数字
() 看成整体匹配
| 或运算符

location

lication的分类

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

location 常用的匹配规则

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

location 匹配的优先级

location 示例

示例1:精准匹配

[root@www ~]# vim /usr/local/nginx/conf/nginx.conf

此时浏览器访问http://www.kgc.com/test1则访问的是根目录下test1目录内的index.html

如果访问http://www.kgc.com则会访问根目录下的index.html

通用匹配

location / {}

location /test/ {}

location /test/abc {}

示例

新建网页站点目录,新建index.html文件

[root@www data]# systemctl restart nginx

此时网页测试说明除去优先级匹配通用匹配内后缀长的优先级高

正则匹配

location ^~ /images/ {}

location ~ .(gif|jpg|jpeg)$ {}*

示例:

分别把狗和猫的图片放入/opt/test/gou.gif、/data/test/gou.gif取名为一样的,狗在opt猫在data。

重启服务测试明显可以看出访问的是opt目录所以说正则匹配前缀的优先级要比后缀高。

[root@www test]# systemctl restart nginx

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

lcation 匹配

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

第一个必选规则

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

第二个必选规则

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

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

第三个规则

location / {
    proxy_pass http://tomcat_server;
}

rewrite

rewrite跳转场景

Rewrite 跳转场景主要包括以下几种

Rewrite 跳转实现

rewrite 执行顺序

语法格式

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

flag标记说明

rewrite 示例

基于域名的跳转

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

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

echo "192.168.80.10 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

此时重启服务网页输入http://www.kgc.com会跳转到http://www.benet.com

基于客户端 IP 访问跳转

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

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

server {
	listen       80;
	server_name  www.kgc.com;		
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;		

set $rewrite true;						
if ($remote_addr = "192.168.239.10"){		
    set $rewrite false;
}

if ($rewrite = true){						
    rewrite (.+) /weihu.html;				
}

location = /weihu.html {
    root /var/www/html;						
}

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

}

mkdir -p /var/www/html/
echo "hello" > /var/www/html/weihu.html
systemctl restart nginx

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

新建站点目录文件重启服务

在其他主机写入本主机的映射关系![1652018588958]

网页测试

本主机访问

其他主机访问

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

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.kgc.com;		
	charset utf-8;
	
	access_log  /var/log/nginx/www.kgc.com-access.log;
	location /post {
        rewrite (.+) http://www.kgc.com/bbs$1 permanent;		
    }
	

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/index.html
echo "192.168.80.10 bbs.kgc.com"  >> /etc/hosts
systemctl restart nginx

创建站点目录文件

添加域名映射关系重启服务

此时使用浏览器访问 http://bbs.kgc.com/post/index.html 跳转到 http://www.kgc.com/bbs/post/index.html

基于参数匹配的跳转

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

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

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

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

}

$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.kgc.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.kgc.com/100-200-100.htmlhttp://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面。

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

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

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

location ~* /upload/.*\.php$ {
    rewrite (.+) http://www.kgc.com permanent;
}

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

}

systemctl restart nginx

重启服务浏览器访问 http://www.kgc.com/upload/123.php 跳转到http://www.kgc.com页面。

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

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

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

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

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

}


systemctl restart nginx

重启服务浏览器访问 http://www.kgc.com/abc/123.html 跳转到http://www.kgc.com页面。

标签:www,匹配,rewrite,Nginx,kgc,html,location,com
来源: https://www.cnblogs.com/gengbo/p/16247412.html