Nginx 重写功能

  • 一、Nginx常见模块
  • 二、访问路由location
    • 2.1 location常用正则表达式
    • 2.2location的分类
    • 2.3location 常用的匹配规则
    • 2.4location优先级排列说明
    • 2.5 location实例
    • 2.6location 优先级总结
    • 2.7实例
      • 2.7.1location = / {} 与 location / {}
      • 2.7.2 location = /index.html {} 与 location / {}
      • 2.7.3location = /1.jpg {} 和 location ~* .(gif|jpg|png|jpeg)$ {}比较
    • 2.8实际网站使用中的三个匹配规则定义
      • 第一个规则
      • 第二个规则
      • 第三个规则
  • 三、REWRITE模块
    • 3.1rewrite功能
    • 3.2Rewrite 跳转场景
    • 3.3Rewrite 跳转实现
    • 3.4Rewrite 执行顺序
    • 3.5Rewrite 语法格式
    • 3.6 Rewrite 实例
      • 3.6.1基于域名的跳转
      • 3.6.2基于客户端IP 访问跳转
      • 3.6.3基于旧域名跳转到新域名后面加目录
      • 3.6.4基于参数匹配的跳转
      • 3.6.5 基于目录下所有的php文件
      • 3.6.6 基于普通的一条url
  • 【总结】

一、Nginx常见模块

http

http块是Nginx服务器配置中的重要部分,代理、缓存和日志定义等绝大多数的功能和第三方模块的配置都可以放在这模块中。作用包括:文件引入、MIME-Type定义、日志自定义、是否使用sendfile传输文件、连接超时时间、单连接请求数上限等。

server

server块,虚拟主机(虚拟服务器)。作用:使得Nginx服务器可以在同一台服务器上只要运行一组Nginx进程,就可以运行多个网站。

location

location块是server块的一个指令。作用:基于Nginx服务器接收到的请求字符串,虚拟主机名称(ip,域名)、url匹配,对特定请求进行处理。

二、访问路由location

2.1 location常用正则表达式

匹配符 表示含义
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ 匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? 匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. 表示任意一个字符
\转义字符 用于取消特殊符号的含义
\d 匹配纯数字
\s 匹配空的(空格或者制表符)
{n} 匹配前面的子表达式n次
{n,} 匹配前面的子表达式不少于n次
{n,m} 匹配前面的子表达式n到m次
[ ] 匹配括号中的一个字符
[c] 匹配单个字符 c
[a-z] 匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] 匹配所有大小写字母或数字
() 表达式的开始和结束位置
l 或运算符

2.2location的分类

精准匹配:location = / {}

一般匹配:location / {}

正则匹配:location ~ / {}

2.3location 常用的匹配规则

规则表达式 规则含义
= 进行普通字符精确匹配。也就是完全匹配
^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他 location
~ 表示执行一个正则匹配,区分大小写
~* 表示执行一个正则匹配,不区分大小写
!~ 表示执行一个正则匹配,区分大小写不匹配
!~* 表示执行一个正则匹配,不区分大小写不匹配

2.4location优先级排列说明

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

location = / {[ configuration A ]
}location / {[ configuration B ]
}location /documents/ {[ configuration C ]
}location ^~ /images/ {[ configuration D ]
}location ~* \.(gif|jpg|jpeg)$ {[ configuration E ]
}

2.5 location实例

(1)精确匹配

location = / {}
=为精确匹配 / , 主机名后不能携带任何字符串,比如 / 和 /data ,则/匹配,/data不匹配

(2)一般匹配/通用匹配

location / {}
代表以/开头,所以这条规则将匹配所有的请求
location /documents/ {}
匹配任何以/documents/开头的地址,匹配符合后,还会继续往下搜索其他 location,只有其它location后面的正则表达式没有匹配到时,才会用这一条
location /documents/abc {}
匹配任何以/documents/abc开头的地址,匹配符合后,还会继续往下搜索其他 location,只有其它location后面的正则表达式没有匹配到时,才会用这一条

(3)正则匹配

location ^~ /images/ {}
匹配任何已/images/ 开头的地址,匹配符合后,停止往下搜索,采用这一条
location ~* \.(gif|jpg|jpeg)$ {}
匹配所有 gif jpg 或 jepg 结尾的请求
如果 有上面的location ^~ /images/ {}匹配  则会先匹配上一请求,所以到不了这一条。

2.6location 优先级总结

如果是匹配某个具体文件: (location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) >(location ~ 完整路径) > (location /)通用匹配

2.7实例

2.7.1location = / {} 与 location / {}

实例1:location = / {} 和 location / {} ,按道理应匹配前者,但实际确实匹配后者,匹配只写域名精确匹配不生效,接下来一个小例子说明一下

1. #在配置文件添加匹规则
vim  /usr/local/nginx/conf/nginx.conf#添加的网页location = / {     root   /web/dog/;}#默认网页location / {root   html;index  index.html index.htm;        }2. #新建网页站点目录
mkdir -p /web/dog3. #在站点目录下新建index.html
vim /web/dog/index.htmlthis is dog web4. #检查语法并重启
nginx -t
systemctl restart nginx.service 5. #在网页中测试
http://192.168.61.24/

2.7.2 location = /index.html {} 与 location / {}

在 根后 加上index.html 后生效

1. #修改一下配置文件
vim  /usr/local/nginx/conf/nginx.conflocation = /index.html {  # 加上index.html root   /web/dog/;}2. #重启服务,并网页中测试
systemctl restart nginx.service 


2.7.3location = /1.jpg {} 和 location ~* .(gif|jpg|png|jpeg)$ {}比较

1. #修改一下配置文件
vim  /usr/local/nginx/conf/nginx.conflocation = /1.jpg { root   /web/dog/;   #小狗的网页}location ~* \.(jpg|gif|png) {root   /web/cat/;  #小猫的网页}2. #在刚刚创建的dog的站点下添加图片
cd /web/dog/
拖入图片3. #新建一个cat目录,添加图片
mkdir cat
cd cat
拖入图片4. #检查语法,重启服务
nginx -t
nginx -s reload5. #在网页中测试
http://192.168.59.118/1.jpg
结果可以看出=精确匹配

两张图片都用1.jpg命名

出来的是狗的图片,精确匹配=优先

2.8实际网站使用中的三个匹配规则定义

第一个规则

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

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

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

第二个规则

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

location ^~ /static/ {root /webroot/static/ ;
}      location ~* \.(gif|jpg|jpeg)$ {root /webroot/static/ ;
}

第三个规则

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

location  / {proxy_pass http://tomcat_server;
}

三、REWRITE模块

现在 Nginx 已经成为很多公司作为前端反向代理服务器的首选,在实际工作中往往会 遇到很多跳转(重写 URL)的需求。比如更换域名后需要保持旧的域名能跳转到新的域名 上、某网页发生改变需要**跳转到新的页面、网站防盗链等等需求。如果在后端使用的 Apache 服务器,虽然也能做跳转,规则库也很强大,但是用 Nginx 跳转效率会更高,**这也是学习 本章的目的所在。

3.1rewrite功能

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

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

3.2Rewrite 跳转场景

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

  1. 可以调整用户浏览的 URL,看起来更规范,合乎开发及产品人员的需求
  2. 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态 URL 地址伪装成静态地址提供服务
  3. 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com
  4. 根据特殊变量、目录、客户端的信息进行 URL 调整等。

3.3Rewrite 跳转实现

  • Nginx 是通过 ngx_http_rewrite_module 模块支持 url 重写、支持 if 条件判断,但不支 持 else。
  • 另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。
  • 根据相关变量重定向和选择不同的配置,从一个 location 跳转到另一个 location,不过这样 的循环最多可以执行 10
    次,超过后 Nginx 将返回 500 错误。
  • 同时,重写模块包含 set
    指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。

3.4Rewrite 执行顺序

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

3.5Rewrite 语法格式

rewrite <regex> <replacement> [flag];
regex:表示正则匹配规则
replacement:表示跳转后的内容
flag:表示rewrite 支持的 flag 标记flag 标记说明:
last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中break:本条规则匹配完成即终止,不再匹配后面的任何规则。一般用在location中redirect:返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址,爬虫不会更新 url(因为是临时)。permanent:返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址,爬虫更新 url。

3.6 Rewrite 实例

3.6.1基于域名的跳转

例如现在访问的是 域名kiro.com启用了顺米网shunmi.com的DNS服务!,现在需要将这个域名下面的发帖都跳转到 http://www.dhc.com,注意保持域名跳转后的参数不变。

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.yxp.com; charset utf-8;#access_log  logs/host.access.log  main;location / {root   html;index  index.html index.htm;}location /index.html {if ($host = 'www.kiro.com') {rewrite ^/(.*)$ http://www.dhc.com/$1 permanent;}root   /web/test;}2. #新建站点目录
mkdir /web/test3. #新建文件
vim /web/test/index.html
this is test web!!!4. #重启服务
nginx -s reload5. #另外开一台虚拟机,修改/etc/hosts文件
vim /etc/hosts
192.168.61.24 www.kiro.com www.dhc.com6. #打开新开的虚拟机的浏览器网页测试
http://www.kiro.com


新建站点目录和文件,并重启服务
另开一台虚拟机 修改/etc/hosts文件

在另一台主机的网页测试一下:


3.6.2基于客户端IP 访问跳转

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.kiro.com;charset utf-8;#access_log  logs/host.access.log  main;set $rewrite true;if ($remote_addr = '192.168.61.128'){set $rewrite false;}if ($rewrite = true){rewrite (.+) /weihu.html;}location /weihu.html {root   /var/www/html;}location / {root   html;index  index.html index.htm;}2. #新建站点目录及文件
mkdir -p /var/www/html
vim /var/www/html/weihu.htmlwe are busing now,please wait for a moment!3. #重启服务                            nginx -s reload4. #在网页测试
http://192.168.61.24/

修改配置文件

新建站点目录及文件


重启服务在网页测试


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

例如现在访问的是 http://bbs.kiro.com/post 现在需要将这个域名下面的发帖都跳转到 http://www.yxp.com/bbs/post,注意保持域名跳转 后的参数不变。

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kiro.com;charset utf-80;#access_log  logs/host.access.log  main;location /post {rewrite (.+) http://www.kiro.com/bbs$1 permanent;}location / {root   html;index  index.html index.htm;}2. #新建站点目录,并创建文件
mkdir -p /usr/local/nginx/html/bbs/post
vim /usr/local/nginx/html/bbs/post/index.htmlthis is the test!!3. #开一台服务器,修改/etc/hosts文件
vim /etc/hosts
192.168.61.128 www.kiro.com www.dhc.com bbs.kiro.com4. #重启服务并在浏览器中测试
nginx -s reloadhttp://bbs.kiro.com/post

修改配置文件

新建站点目录及文件

重启服务并在浏览器中测试

3.6.4基于参数匹配的跳转

http://www.kiro.com/100-(100|200)-100.html 跳转到 域名kiro.com启用了顺米网shunmi.com的DNS服务! 页面

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.kiro.com;charset utf-8;#access_log  logs/host.access.log  main;location ~ /100-(100|200)-(\d+).html$ {rewrite (.+) http://www.kiro.com permanent;}location / {root   html;index  index.html index.htm;}
-----------------方法二-----------------if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.kgc.com permanent;}$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      2. #重启服务
nginx -s reload3. #验证
http://www.kiro.com/100-100-100

修改配置文件

重启服务

在浏览器中测试

3.6.5 基于目录下所有的php文件

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

1. #修改配置文件
vim  /usr/local/nginx/conf/nginx.confserver {listen       80;server_name  www.kiro.com;charset utf-8;#access_log  logs/host.access.log  main;location ~* /upload/.*\.php$ {rewrite (.+) http://www.kiro.com permanent;}location / {root   html;index  index.html index.htm;}2. #重启服务
systemctl restart nginx3. #在网页测试
http://www.kiro.com/upload/123.php

修改配置文件

重启服务

在网页中测试

3.6.6 基于普通的一条url

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

1. #修改配置文件server {listen       80;server_name  www.kiro.com;charset utf-8;#access_log  logs/host.access.log  main;location ~* ^/abc/123.html$ {rewrite (.+) http://www.kiro.com permanent;}location / {root   html;index  index.html index.htm;}2. #重启服务
systemctl restart nginx3. #在网页测试
http://www.kiro.com/abc/123.html

修改配置文件

重启服务

在网页中测试

【总结】

nginx的重写功能使得网页的安全性得以大大的提高,也方便了企业分流管理,相比于Apache的重写功能,nginx的匹配条件优化要好得多。

Nginx 重写功能(location / rewrite)相关推荐

  1. Nginx重写功能(rewrite与location)

    目录 一 .常用的nginx 正则表达式 二 .nginx 配置文件里 location 项 2.1 localtion 作用 2.2 location 可以分为三类 2.3 location 的常用 ...

  2. Nginx重写功能rewrite

    目录 一.Rewrite简单介绍 1.Rewrite的概述 2.Rewrite跳转场景 3.URI.URL.URN 4.Rewrite跳转实现 5.Rewrite实际场景 6.Nginx正则表达式 7 ...

  3. 前端开发掌握nginx常用功能之rewrite

    上一篇博文对nginx最常用功能的server及location的匹配规则进行了讲解,这也是nginx实现控制访问和反向代理的基础.掌握请求的匹配规则算是对nginx有了入门,但是这些往往还是不能满足 ...

  4. 实例演示Nginx重写(Rewrite)类型last、break、redirect和permanent的区别

    本文使用之前制作的Docker容器<<Docker案例:搭建nginx服务>>演示Nginx四种重写类型的区别和效果,如果尚未构建Docker服务可参考之前的文章,或者自建Ng ...

  5. Nginx中的location规则与rewrite重写(详解)

    内容预知 1.Nginx中location与rewrite 1.1 location与rewrite常用的正则表达式 1.2  location与rewrite的联系和区别 2.location的匹配 ...

  6. Nginx使用之location和rewrite用法

    Nginx使用之location和rewrite用法 一.常见的Nginx正则表达式 二.location 1.location大致可以分为三类 2.location常用的匹配规则 3.locatio ...

  7. Nginx重写rewrite

    目录 一.常用的Nginx正则表达式 二.location匹配 三.rewrite重写 四.rewrite跳转 一.常用的Nginx正则表达式 ^ 匹配输入字符串的起始位置 $ 匹配输入字符串的结束为 ...

  8. Nginx地址重写功能

    Nginx地址重写功能

  9. Nginx(8)_return和rewrite

    return指令 功能: 停止处理请求,直接返回响应码或重定向到其他URL 执行return指令后,location中后续指令将不会被执行 语法: return code [text]; return ...

最新文章

  1. MySQL 中的 FOUND_ROWS() 与 ROW_COUNT() 函数
  2. secureCRT 右键的设置选中就copy or 选中即粘贴
  3. mysql+自动还原备份_Mysql 自动备份与恢复
  4. c++ List(双向链表)
  5. html大气网页模板,HTML蓝色大气形式扁平企业官网网页模板代码
  6. Webpack 中 css import 使用 alias 相对路径
  7. JQuery函数大全
  8. 计算机职业规划备选方案,职业规划中的备选方案.doc
  9. 手机python30编程教程入门_Python新手入门教程_在手机上就能学习编程的软件
  10. ICCV 2017:训练GAN的16个技巧,2400+星(PPT)
  11. Windows10系统下对于鲁大师一类捆绑流氓软件的解决方法
  12. IDEA插件下载地址
  13. Win10下载nmap!!!!(超详细,学不会直接远程指导)
  14. 【4】 脑部MRI图像肿瘤分类级别
  15. index ffs、index fs原理考究
  16. js实现简单的视频播放
  17. OSPF的知识点总结及其扩展
  18. 授信合同与贷款合同的区别
  19. 【Hello Linux】Linux入门
  20. 判断计算机硬件和网络故障,计算机硬件故障的识别与处理

热门文章

  1. Android吃鸡 3dtouch,吃鸡主播为何不用3Dtouch技术操作?主播:只有新手才会用
  2. Qt编写安防视频监控系统46-视频存储
  3. 第三章 java集合
  4. 周末学习总结(LIO标定+kitti数据集的使用+evo工具的使用+开源数据集+ssh的使用)
  5. 最速降线问题公式推导
  6. Mac 重启后,连接不上wifi
  7. 雷神3开方算法解析,游戏运行速度提高四倍。
  8. JVM 重点知识点总结
  9. CC00009.CloudOpenStack——|OpenStack组件.V02|——|openstack-glance|controller节点下部署glanc
  10. 使用第三方SDK进行网页授权