我是靠谱客的博主 靓丽大船,最近开发中收集的这篇文章主要介绍Nginx Rewrite 和正则表达式前言一、Nginx Rewrite介绍二、实际网站使用中,至少有三个匹配规则定义2、第二个必选规则三、rewrite命令常用判断表达式四、实际应用六、基于最普通一条 url 请求的跳转总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

前言

一、Nginx Rewrite介绍

1. Rewrite 跳转场景

2. Rewrite 跳转实现

3、Nginx跳转需求的实现方式

4、nginx rewrite中的正则表达式

 5、rewrite命令语法

6、location简介

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

1、第一个必选规则

2、第二个必选规则

3、第三个是通用规则

三、rewrite命令常用判断表达式

1、判断表达式

2、判断全局变量

四、实际应用

1、基于域名的跳转

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

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

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

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

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

总结


前言

        现在Nginx已经成为很多公司作为前端反向代理服务器的首选,在实际的工作中往往会遇到很

多跳转(重写URL)的需求,例如,更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生

改变需要跳转到新的页面、网站防盗链等等需求。如果在后端使用的apache服务器,虽然也可以

做跳转,规则库也很强大,但使用NGINX跳转效率更高,因为可以使用正则精确匹配。

一、Nginx Rewrite介绍

1. Rewrite 跳转场景

◆ 调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求。

◆ 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。

◆ 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com 会跳转到

jd.com。

◆ 服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行 URL 调整等

2. Rewrite 跳转实现

◆ 跳转实现都是通过ngx_http_rewrite_module模块来进行的。

◆ Nginx:是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支持 else,

支持if单分支,但是不支持双分支判断 。

◆ PCRE 支持:该模块需要PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。

◆ 跳转:根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样

的循环最多可以执行10次,超过后 Nginx 将返回500错误。

◆ 重写模块:包含 set 指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件

标识、传递参数到其他 location、记录做了什么等等。

注:rewrite功能就是,使用 Nginx 提供的全局变量或自己设置的变量,结合正则表达式和标志位实

现URL的重写以及重定向。

3、Nginx跳转需求的实现方式

◆ 使用rewrite进行匹配跳转

◆ 使用if匹配全局变量后跳转

◆ 使用location匹配再跳转

注:rewrite放在server{},if{},location{}段中,location只对域名后边的除去传递参数外的字符串

起作用。对域名或参数字符串匹配,使用if全局变量匹配;以及使用proxy_pass反向代理。

4、nginx rewrite中的正则表达式

常用的正则表达式元字符:

 5、rewrite命令语法

 命令格式:rewrite  <regex(正则)>  <replacement(跳转后的内容)>  [flag(rewrite支持的flag标记)];

flag标记说明

标记

说明

last

相当于Apache的[L]标记,表示完成rewrite

break

本条规则匹配完成即终止,不再匹配后面的任何规则

redirect

返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url

permanent      

返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url

lasr和break比较

last使用场景,一般写在server和if中;URL匹配不终止重写后的url匹配。

break使用场景,一般使用在location中;URL匹配终止重写后的url|匹配。

6、location简介

⑴、location 分类

精准匹配:location = / { ...}

示例:location = patt { }                   PS:精确匹配字符串

一般匹配:iocation / {...}

示例:location patt { }                     PS:只要包含patt的字符串即可

正则匹配: location ~ / {...}

示例:location ~ patt  {...}                  PS:按照正则表达式的方式匹配

⑵、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/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

⑷、rewrite和location比较

  • 相同点:都能实现跳转。
  • 不同点:

rewrite是在同一域名内更改获取资源的路径。

location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器。

rewrite会写在location里,执行顺序。执行server块里面的rewrite指令;执行location匹配;执行选

定的location中的rewrite指令。

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

1、第一个必选规则

        直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。可

以是静态首页,也可以直接转发给后端应用服务器

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

2、第二个必选规则

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

匹配,任选其一或搭配使用。

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

location ~* . (html Igif ljpg ljpeglpnglcssljslico)$ {
root /webroot / res/ ;
}

3、第三个是通用规则

        比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器,非静态文件请求就默认是动态

请求(跳转/反向代理)

upstreamtomcat_server {
192.168.100.128:80
192.168.100.132:80
}
 
location / {
    proxy_pass http://tomcat_server;
}

httpd服务

跑一些应用在HTTPD 服务中,以这类形式提供服务的话HTTPD就是做为应用服务器

如果HTTPD仅做为“处理动态请求”定位,则httpd就是做为web服务器

app对应的执行代码需要一个环境做支持/支撑环境,可以由应用服务器提供——HTTPD、tomcat

三、rewrite命令常用判断表达式

1、判断表达式

-f 和 !-f用来判断是否存在文件

-d 和 !-d用来判断是否存在目录

-e 和 !-e用来判断是否存在文件或目录

-x 和 !-x用来判断文件是否可执行

2、判断全局变量

$args           #这个变量等于请求行中的参数。

$content_length # 请求头中的Content-length字段。

$content_type   # 请求头中的Content-Type字段。

$document_root  # 当前请求在root指令中指定的值。

$host           # 请求主机头字段,否则为服务器名称。

$http_user_agent # 客户端agent信息

$http_cookie    # 客户端cookie信息

$limit_rate     # 这个变量可以限制连接速率。

$request_body_file # 客户端请求主体信息的临时文件名。

$request_method  # 客户端请求的动作,通常为GET或POST。

$remote_addr    # 客户端的IP地址。

$remote_port    # 客户端的端口。

$remote_user    # 已经经过Auth Basic Module验证的用户名。

$request_filename # 当前请求的文件路径,由root或alias指令与URI请求生成。

$query_string   # 与$args相同。

$scheme #HTTP 方法(如http,https)。

$server_protocol # 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$server_addr    # 服务器地址,在完成一次系统调用后可以确定这个值。

$server_name    # 服务器名称。

$server_port    # 请求到达服务器的端口号。

$request_uri    # 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。

$uri # 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。

$document_uri   # 与$uri相同。

例:http://localhost:88/test1/test2/test.php

$host:localhost

$server_port:88

$request_uri:http://localhost:88/test1/test2/test.php

$document_uri:/test1/test2/test.php

$document_root:D:nginx/html

$request_filename:D:nginx/html/test1/test2/test.php

四、实际应用

1、基于域名的跳转

       这里我们将旧域名www.test.com变更,使用新域名www.kang.com代替,但是不移除旧域名,

并且登陆旧域名将跳转到新域名上,而且后面的参数保持不变。

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

    server {
        listen   80;
        server_name  www.test.com;   #旧域名

        charset utf-8;

        access_log  /var/log/nginx/test.access.log ;  #修改日志文件路径

        location / {
			#添加域名重定向
            if ($host = 'www.test.com') {
#$host为rewrite全局变量,代表请求主机头字段或主机名
                rewrite ^/(.*)$ http://www.kang.com/$1 permanent;  #新域名
#$1为正则匹配的内容,即域名后边的字符串
				}
            root  html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# echo "192.168.100.128 www.test.com www.kang.com" >> /etc/hosts
[root@kaka ~]# mkdir -p  /var/log/nginx    #创建日志目录
[root@kaka ~]# systemctl restart nginx.service

结果验证如下:

 

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

当访问的是 http://ddd.test.com/post/1.html 会自动跳转到 http://www.kang.com/bbs/post/1.html

[root@kaka ~]# mkdir -p /usr/local/nginx/html/bbs/post
[root@kaka ~]# echo "<h1> this is 1.html </h1>" >> /usr/local/nginx/html/bbs/post/1.html
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf

        listen   80;
        server_name  ddd.test.com;   #修改域名

        charset utf-8;

        access_log  /var/log/nginx/kang.access.log ;  #修改日志名
        location /post {
            rewrite (.+) http://www.kang.com/bbs$1 permanent;
			#这里$1为位置变量,代表/post
        }
        location / {
            root html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# vim /etc/hosts
192.168.100.128 ddd.test.com www.kang.com  #添加
[root@kaka ~]# systemctl restart nginx.service

访问http://ddd.test.com/post/1.html 会自动跳转到http://www.kang.com/bbs/post/1.html,验证结果

如下:

 

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

所有IP访问任何内容都显示一个固定维护页面,只有公司IP 192.168.100.128访问正常。

[root@kaka ~]# vim /etc/hosts
[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
    server {
        listen   80;
        server_name  www.test.com;
        charset utf-8;
        access_log  /var/log/nginx/www.test.access.log ;
        set $rewrite true;   
  #设置是否合法的IP标记,设置变量$rewrite,变量值为boole值true
           if ($remote_addr = "192.168.100.128") {
#当客户端IP为192.168.100.12时,将变量值设为false,不进行重写
              set $rewrite false;
           }
           if ($rewrite = true) {     #当变量值为true时,进行重写
              rewrite (.+) /weihu.html;
  #重写在访问IP后边插入/weihu.html
           }
        location = /weihu.html {
            root /var/www/html;   #网页返回/var/www/html/weihu.html的内容
                }
        location / {
            root html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# mkdir -p /var/www/html   #创建维护网页
[root@kaka ~]# echo "weihu" > /var/www/html/weihu.html
[root@kaka ~]# systemctl restart nginx

结果验证如下:

 

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

 

[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
    server {
        listen   80;
        server_name  www.test.com;
        charset utf-8;
        access_log  /var/log/nginx/www.test.access.log ;
#$request_uri 内置变量,表示URI,d 纯数字
           if ($request_uri ~ ^/100-(100|200)-(d+).html$) {
              rewrite (.*) http://www.test.com permanent;
           }
        location / {
            root html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# systemctl restart nginx

验证如下:

        url是统一资源定位符,对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互

联网上标准资源的地址。

这里当我们访问如http://www.test.com/100-100-10.html的站点目录时都会跳转到www.test.com

 

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

        要求访问 http://www.test.com/upload/aaa.php 跳转到首页www.ly.com (一般在注册时用到的

较多)

[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
    server {
        listen   80;
        server_name  www.test.com;
        charset utf-8;
        access_log  /var/log/nginx/www.test.access.log ;
        location ~* /upload/.*.php$ {
            rewrite (.+) http://www.test.com permanent;
        }
        location / {
            root html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# systemctl restart nginx

结果验证如下:

 

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

       当访问一个具体的页面站点目录时,跳转至首页。

[root@kaka ~]# vim /usr/local/nginx/conf/nginx.conf
……
    server {
        listen   80;
        server_name  www.test.com;

        charset utf-8;

        access_log  /var/log/nginx/www.test.access.log ;
        location ~* /aaa/111.html {
            rewrite (.+) http://www.test.com permanent;
        }
        location / {
            root html;
            index  index.html index.htm;
        }
……
[root@kaka ~]# systemctl restart nginx

总结

1、Nginx和nginx的优缺点:

1.1apache优点:

1.1.1、守护进程相对稳定,重连机制做得好

1.1.2、跟php交互基本用module,在php上不用配置太多参数

1.1.3、相对nginx,重写(rewrite)支持更好

1.1.4、采用module,可拓展性更强,可以在任一阶段插入钩子增加灵活性。

1.2apache缺点:

1.2.1、由于使用module形式加载,导致整个项目比较重

1.2.2、同步阻塞模型,容易导致进程阻塞无法正常访问

1.2.3、新加入的模型event据传性能相当不错,但目前官方称仍属于调试阶段,并不建议在生产环境使用。

1.3nginx优点:

1.3.1、异步io处理模型,可以支持更高的并发

1.3.2、整体是个轻框架,反向代理一级棒(负载均衡)

1.3.3、采用php-fpm fastcgi模式连接php,负载量可以更大

1.3.4、定位nginx是做静态页面处理(OSI层应用层HTTP/HTTPS协议),NGINX在第七层工作,静态页面处理3-5万

1.4nginx缺点:

1.4.1、守护进程由于给php-fpm做了,所以非常受限于php-fpm。一个输入参数可能会导致整个程序运行不下去

1.4.2、php-fpm要额外配置,排查问题多了一个环境需要排查

1.4.3、nginx可以执行rewrite,但性能没有apache那么好

2、nginx优化与防盗链

Nginx是企业中运行较多的服务之一,nginx优化,首先是提高用户体验,提供服务端,运行效率和性能

3、nginx rewrite跳转

3.1、服务体验

3.2、基于不同场景需求,精准匹配访问的url,指引跳转到合适的新场景

3.3、nginx rewrite的三种方式

3.3.1、rewrite

3.3.2、if

3.3.3、location4、location 分了匹配方式精准>正则>普通

4、面试题问题:Location的优先顺序是什么

第一是精准匹配;

第二是正则前缀匹配^~;

第三是^和(目录或者文件,如果是目录 ~ 优先级大于 ~,如果是文件,则 ~ 优先级大于 ~)

第四:普通匹配 以xxxx路径为前缀的匹配;

第五:/

 

最后

以上就是靓丽大船为你收集整理的Nginx Rewrite 和正则表达式前言一、Nginx Rewrite介绍二、实际网站使用中,至少有三个匹配规则定义2、第二个必选规则三、rewrite命令常用判断表达式四、实际应用六、基于最普通一条 url 请求的跳转总结的全部内容,希望文章能够帮你解决Nginx Rewrite 和正则表达式前言一、Nginx Rewrite介绍二、实际网站使用中,至少有三个匹配规则定义2、第二个必选规则三、rewrite命令常用判断表达式四、实际应用六、基于最普通一条 url 请求的跳转总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部